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实现拉钩网上的FizzBuzzWhizz问题示例
May 05 Python
python实现画圆功能
Jan 25 Python
tensorflow: variable的值与variable.read_value()的值区别详解
Jul 30 Python
python实现图片彩色转化为素描
Jan 15 Python
Python编写合并字典并实现敏感目录的小脚本
Feb 26 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
Jan 20 Python
Python Scrapy图片爬取原理及代码实例
Jun 12 Python
keras:model.compile损失函数的用法
Jul 01 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 Python
基于Python实现天天酷跑功能
Jan 06 Python
Python+Appium实现自动抢微信红包
May 21 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
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
PHP中字符串长度的截取用法示例
2017/01/12 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
js异或加解密效果代码
2008/06/25 Javascript
JavaScript Prototype对象
2009/01/07 Javascript
Javascript页面添加到收藏夹的简单方法
2013/08/07 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
详解微信小程序轨迹回放实现及遇到的坑
2021/02/02 Javascript
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
使用PYTHON创建XML文档
2012/03/01 Python
简单了解python模块概念
2018/01/11 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
用HTML5制作一个简单的弹力球游戏
2015/05/12 HTML / CSS
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
创造美妙香氛体验:Aera扩散器和香水
2018/11/25 全球购物
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
车间班长岗位职责
2013/11/30 职场文书
创业计划书六个要素
2013/12/26 职场文书
物业管理专业求职信
2014/06/11 职场文书
源码安装apache脚本部署过程详解
2022/09/23 Servers