• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Python concurrent.futures模块使用实例

python 搞代码 4年前 (2022-01-08) 23次浏览 已收录 0个评论

这篇文章主要介绍了Python concurrent.futures模块使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了Python concurrent.futures模块使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

concurrent.futures的作用:

管理并发任务池。concurrent.futures模块提供了使用工作线程或进程池运行任务的接口。线程和进程池API都是一样,所以应用只做最小的修改就可以在线程和进程之间地切换

1、基于线程池使用map()

futures_thread_pool_map.py

 #!/usr/bin/env python # -*- coding: utf-8 -*- from concurrent import futures import threading import time def task(n): print('{}: 睡眠 {}'.format(threading.current_thread().name,n)) time.sleep(n / 10) print('{}: 执行完成 {}'.format(threading.current_thread().name,n)) return n / 10 ex = futures.ThreadPoolExecutor(max_workers=2) print('main: 开始运行') results = ex.map(task, range(5, 0, -1)) #返回值是generator 生成器 print('main: 未处理的结果 {}'.format(results)) print('main: 等待真实结果') real_results = list(results) print('main: 最终结果: {}'.format(real_results))

运行效果

 [root@ mnt]# python3 futures_thread_pool_map.py main: 开始运行 ThreadPoolExecutor-0_0: 睡眠 5 ThreadPoolExecutor-0_1: 睡眠 4 main: 未处理的结果 <generator object executor.map..result_iterator at 0x7f1c97484678> main: 等待真实结果 ThreadPoolExecutor-0_1: 执行完成 4 ThreadPoolExecutor-0_1: 睡眠 3 ThreadPoolExecutor-0_0: 执行完成 5 ThreadPoolExecutor-0_0: 睡眠 2 ThreadPoolExecutor-0_0: 执行完成 2 ThreadPoolExecutor-0_0: 睡眠 1 ThreadPoolExecutor-0_1: 执行完成 3 ThreadPoolExecutor-0_0: 执行完成 1 main: 最终结果: [0.5, 0.4, 0.3, 0.2, 0.1]

2、futures执行单个任务

futures_thread_pool_submit.py

 #!/usr/bin/env python # -*- coding: utf-8 -*- from concurrent import futures import threading import time def task(n): print('{}: 睡眠 {}'.format(threading.current_thread().name, n)) time.sleep(n / 10) print('{}: 执行完成 {}'.format(threading.current_thread().name, n)) return n / 10 ex = futures.ThreadPoolExecutor(max_workers=2) print('main :开始') f = ex.submit(task, 5) print('main: future: {}'.format(f)) print('等待运行结果') results = f.result() print('main: result:{}'.format(results)) print('main: future 之后的结果:{}'.format(f))

运行效果

 [root@ mnt]# python3 futures_thread_pool_submit.py main :开始 ThreadPoolExecutor-0_0: 睡眠 5 main: future:  等待运行结果 ThreadPoolExecutor-0_0: 执行完成 5 main: result:0.5 main: future 之后的结果:

3、futures.as_completed()按任意顺序运行结果

futures_as_completed.py

 #!/usr/bin/env python # -*- coding: utf-8 -*- import rand<mark style="color:transparent">来源gaodaimacom搞#^代%!码网</mark>om import time from concurrent import futures def task(n): time.sleep(random.random()) return (n, n / 10) ex = futures.ThreadPoolExecutor(max_workers=2) print('main: 开始') wait_for = [ ex.submit(task, i) for i in range(5, 0, -1) ] for f in futures.as_completed(wait_for): print('main: result:{}'.format(f.result()))

运行效果

 [root@ mnt]# python3 futures_as_completed.py main: 开始 main: result:(5, 0.5) main: result:(4, 0.4) main: result:(3, 0.3) main: result:(1, 0.1) main: result:(2, 0.2)

4、Future回调之futures.add_done_callback()

futures_future_callback.py

 #!/usr/bin/env python # -*- coding: utf-8 -*- from concurrent import futures import time def task(n): print('task {} : 睡眠'.format(n)) time.sleep(0.5) print('task {} : 完成'.format(n)) return n / 10 def done(fn): if fn.cancelled(): print('done {}:取消'.format(fn.arg)) elif fn.done(): error = fn.exception() if error: print('done {} : 错误返回 : {}'.format(fn.arg, error)) else: result = fn.result() print('done {} : 正常返回 : {}'.format(fn.arg, result)) if __name__ == '__main__': ex = futures.ThreadPoolExecutor(max_workers=2) print('main : 开始') f = ex.submit(task, 5) f.arg = 5 f.add_done_callback(done) result = f.result()

运行效果

 [root@ mnt]# python3 futures_future_callback.py main : 开始 task 5 : 睡眠 task 5 : 完成 done 5 : 正常返回 : 0.5

5、Future任务取消之futures.cancel()

futures_future_callback_cancel.py

 #!/usr/bin/env python # -*- coding: utf-8 -*- from concurrent import futures import time def task(n): print('task {} : 睡眠'.format(n)) time.sleep(0.5) print('task {} : 完成'.format(n)) return n / 10 def done(fn): if fn.cancelled(): print('done {}:取消'.format(fn.arg)) elif fn.done(): error = fn.exception() if error: print('done {} : 错误返回 : {}'.format(fn.arg, error)) else: result = fn.result() print('done {} : 正常返回 : {}'.format(fn.arg, result)) if __name__ == '__main__': ex = futures.ThreadPoolExecutor(max_workers=2) print('main : 开始') tasks = [] for i in range(10, 0, -1): print('main: submitting {}'.format(i)) f = ex.submit(task, i) f.arg = i f.add_done_callback(done) tasks.append

以上就是Python concurrent.futures模块使用实例的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Python concurrent.futures模块使用实例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址