Python concurrent.futures模块使用实例


Posted in Python onDecember 24, 2019

这篇文章主要介绍了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.<locals>.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: <Future at 0x7f40c0a6a400 state=running>
等待运行结果
ThreadPoolExecutor-0_0: 执行完成 5
main: result:0.5
main: future 之后的结果:<Future at 0x7f40c0a6a400 state=finished returned float>

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

futures_as_completed.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import random
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((i, f))

  for i, task_obj in reversed(tasks):
    if not task_obj.cancel():
      print('main: 不能取消{}'.format(i))
  ex.shutdown()

运行效果

[root@mnt]# python3 futures_future_callback_cancel.py 
main : 开始
main: submitting 10
task 10 : 睡眠
main: submitting 9
task 9 : 睡眠
main: submitting 8
main: submitting 7
main: submitting 6
main: submitting 5
main: submitting 4
main: submitting 3
main: submitting 2
main: submitting 1
done 1:取消
done 2:取消
done 3:取消
done 4:取消
done 5:取消
done 6:取消
done 7:取消
done 8:取消
main: 不能取消9
main: 不能取消10
task 10 : 完成
done 10 : 正常返回 : 1.0
task 9 : 完成
done 9 : 正常返回 : 0.9

6、Future异常的处理

futures_future_exception

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from concurrent import futures

def task(n):
  print('{} : 开始'.format(n))
  raise ValueError('这个值不太好 {}'.format(n))

ex = futures.ThreadPoolExecutor(max_workers=2)
print('main: 开始...')

f = ex.submit(task, 5)

error = f.exception()
print('main: error:{}'.format(error))

try:
  result = f.result()
except ValueError as e:
  print('访问结果值的异常 {}'.format(e))

运行效果

[root@mnt]# python3 futures_future_exception.py 
main: 开始...
5 : 开始
main: error:这个值不太好 5
访问结果值的异常 这个值不太好 5

7、Future上下文管理即利用with打开futures.ThreadPoolExecutor()

futures_context_manager.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from concurrent import futures

def task(n):
  print(n)

with futures.ThreadPoolExecutor(max_workers=2) as ex:
  print('main: 开始')
  ex.submit(task, 1)
  ex.submit(task, 2)
  ex.submit(task, 3)
  ex.submit(task, 4)
print('main: 结束')

运行效果

[root@ mnt]# python3 futures_context_manager.py 
main: 开始
2
4
main: 结束

8、基于进程池使用map()

futures_process_pool_map.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from concurrent import futures
import os

def task(n):
  return (n, os.getpid())

if __name__ == '__main__':
  ex = futures.ProcessPoolExecutor(max_workers=2)
  results = ex.map(task, range(50, 0, -1))
  for n, pid in results:
    print('task {} in 进程id {}'.format(n, pid))

运行效果

[root@ mnt]# python3 futures_process_pool_map.py 
task 5 in 进程id 9192
task 4 in 进程id 8668
task 3 in 进程id 9192
task 2 in 进程id 8668
task 1 in 进程id 9192

9、基于进程池异常处理

futures_process_pool_broken.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from concurrent import futures
import os
import signal

def task(n):
  return (n, os.getpid())

if __name__ == '__main__':
  with futures.ProcessPoolExecutor(max_workers=2) as ex:
    print('获取工作进程的id')
    f1 = ex.submit(os.getpid)
    pid1 = f1.result()

    print('结束进程 {}'.format(pid1))
    os.kill(pid1, signal.SIGHUP)

    print('提交其它进程')
    f2 = ex.submit(os.getpid)
    try:
      pid2 = f2.result()
    except futures.process.BrokenProcessPool as e:
      print('不能开始新的任务:{}'.format(e))

运行效果

[root@ mnt]# python3 futures_process_pool_broken.py 
获取工作进程的id
结束进程 104623
提交其它进程
不能开始新的任务:A process in the process pool was terminated abruptly while the future was running or pending.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 12306抢火车票脚本
Feb 07 Python
java中两个byte数组实现合并的示例
May 09 Python
将Dataframe数据转化为ndarry数据的方法
Jun 28 Python
python制作图片缩略图
Apr 30 Python
Python向excel中写入数据的方法
May 05 Python
Python数据类型之Set集合实例详解
May 07 Python
对python3 sort sorted 函数的应用详解
Jun 27 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
pandas read_excel()和to_excel()函数解析
Sep 19 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
Python中猜拳游戏与猜筛子游戏的实现方法
Sep 04 Python
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
Apr 06 Python
Python hmac模块使用实例解析
Dec 24 #Python
Python hashlib模块实例使用详解
Dec 24 #Python
Python实现使用dir获取类的方法列表
Dec 24 #Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 #Python
Python中filter与lambda的结合使用详解
Dec 24 #Python
节日快乐! Python画一棵圣诞树送给你
Dec 24 #Python
Python 3 使用Pillow生成漂亮的分形树图片
Dec 24 #Python
You might like
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
php查询ip所在地的方法
2014/12/05 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
jQuery对象和DOM对象使用说明
2010/06/25 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
js 文本滚动效果的实例代码
2013/08/17 Javascript
javascript常用方法汇总
2014/12/02 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
微信小程序学习(4)-系统配置app.json详解
2017/01/12 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
vue的keep-alive中使用EventBus的方法
2019/04/23 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
使用Python下载Bing图片(代码)
2013/11/07 Python
编写Python CGI脚本的教程
2015/06/29 Python
python实现下载指定网址所有图片的方法
2015/08/08 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
python3.8与pyinstaller冲突问题的快速解决方法
2020/01/16 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
详解CSS3原生支持div铺满浏览器的方法
2018/08/30 HTML / CSS
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
瑞士图书网站:Weltbild.ch
2019/09/17 全球购物
瑞士网球商店:Tennis-Point
2020/03/12 全球购物
项目考察欢迎辞
2014/01/17 职场文书
工作睡觉检讨书
2014/02/25 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
安全生产感想
2015/08/07 职场文书
技术入股协议书
2016/03/22 职场文书
Feign调用传输文件异常的解决
2021/06/24 Java/Android
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python