Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和multiprocessing的进一步抽象,对编写线程池/进程池提供了直接的支持,他属于上层的封装,对于用户来说,不用在考虑那么多东西了。

官方参考资料:https://pythonhosted.org/futures/

1.Executor

Exectuor是基础模块,这是一个抽象类,其子类分为ThreadPoolExecutor和ProcessPoolExecutor,分别被用来创建线程池和进程池。

提供的方法如下:

Executor.submit(fn, *args, **kwargs)

fn:为需要异步执行的函数
args,kwargs:为给函数传递的参数
就来看看官网的这个例子:

with ThreadPoolExecutor(max_workers=1) as executor:future = executor.submit(pow, 323, 1235)print(future.result())

我们使用submit方法来往线程池中加入一个task(pow函数),submit返回一个Future对象。其中future.result()的result方法的作用是拿到调用返回的结果。如果没有执行完毕就会去等待。这里我们使用with操作符,使得当任务执行完成之后,自动执行shutdown函数,而无需编写相关释放代码。
关于更多future的具体方法说明看后面的future部分解释。

Executor.map(fn, *args, **kwargs)

map(func, *iterables, timeout=None) 
此map函数和python自带的map函数功能类似,只不过concurrent模块的map函数从迭代器获得参数后异步执行。并且,每一个异步操作,能用timeout参数来设置超时时间,timeout的值可以是int或float型,如果操作timeout的话,会raisesTimeoutError。如果timeout参数不指定的话,则不设置超时间。

func:为需要异步执行的函数 
iterables:可以是一个能迭代的对象.
timeout:设置每次异步操作的超时时间

from concurrent.futures import ThreadPoolExecutorimport requests
URLS = ['http://www.163.com', 'https://www.baidu.com/', 'https://github.com/']def load_url(url):req= requests.get(url, timeout=60)print('%r page is %d bytes' % (url, len(req.content)))
executor = ThreadPoolExecutor(max_workers=3)
executor.map(load_url,URLS)
print('主线程结束')

submit函数和map函数,根据需要,选一个使用即可。

Executor.shutdown(wait=True)

此函数用于释放异步执行操作后的系统资源。Executor实现了enter__和__exit使得其对象可以使用with操作符。
在这里可以使用with上下文关键字代替,如上面第一个submit的例子。

2.Future对象

submit函数返回future对象,future提供了跟踪任务执行状态的方法,Future实例可以被Executor.submit()方法创建。除了测试之外不应该直接创建。

cancel():尝试去取消调用。如果调用当前正在执行,不能被取消。这个方法将返回False,否则调用将会被取消,方法将返回True

cancelled():如果调用被成功取消返回True

running():如果当前正在被执行不能被取消返回True

done():如果调用被成功取消或者完成running返回True

result(Timeout = None):拿到调用返回的结果。如果没有执行完毕就会去等待

exception(timeout=None):捕获程序执行过程中的异常

add_done_callback(fn):将fn绑定到future对象上。当future对象被取消或完成运行时,fn函数将会被调用

3.wait方法

 wait方法接会返回一个tuple(元组),tuple中包含两个set(集合),一个是completed(已完成的)另外一个是uncompleted(未完成的)。使用wait方法的一个优势就是获得更大的自由度,它接收三个参数FIRST_COMPLETED, FIRST_EXCEPTION 和ALL_COMPLETE,默认设置为ALL_COMPLETED。

  如果采用默认的ALL_COMPLETED,程序会阻塞直到线程池里面的所有任务都完成,再执行主线程:

#!/usr/bin/env python  # encoding: utf-8  from concurrent.futures import ThreadPoolExecutor,wait,as_completedimport requests
URLS = ['http://www.163.com', 'https://www.baidu.com/', 'https://github.com/']def load_url(url):req = requests.get(url, timeout=60)print('%r page is %d bytes' % (url, len(req.content)))
executor = ThreadPoolExecutor(max_workers=3)
f_list = []for url in URLS:future = executor.submit(load_url,url)f_list.append(future)
print(wait(f_list))
print('主线程结束')

如果采用FIRST_COMPLETED参数,程序并不会等到线程池里面所有的任务都完成。

from concurrent.futures import ThreadPoolExecutor,wait,as_completedimport requests
URLS = ['http://www.163.com', 'https://www.baidu.com/', 'https://github.com/']def load_url(url):req=requests.get(url, timeout=60)print('%r page is %d bytes' % (url, len(req.content)))
executor = ThreadPoolExecutor(max_workers=3)
f_list = []for url in URLS:future = executor.submit(load_url,url)f_list.append(future)
print(wait(f_list,return_when='FIRST_COMPLETED'))
print('主线程结束')

关于模块的基本使用就是上面的这些。后续会做一些拓展或者案例。

python并发模块之concurrent.futures(一)相关推荐

  1. Python并发编程之concurrent.futures

    2019独角兽企业重金招聘Python工程师标准>>> concurrent.futures模块提供了一个异步执行callables的高级接口. 可以使用ThreadPoolExec ...

  2. python并发编程方法_Python Futures并发编程详解

    无论哪门编程语言,并发编程都是一项很常用很重要的技巧.例如,爬虫就被广泛应用在工业界的各个领域,我们每天在各个网站.各个 App 上获取的新闻信息,很大一部分便是通过并发编程版的爬虫获得. 正确合理地 ...

  3. Python3.2+ 的 concurrent.futures 模块,利用 multiprocessing 实现高并发。

    From:https://www.cnblogs.com/weihengblog/p/9812110.html concurrent.futures 官方文档:https://docs.python. ...

  4. Python 中 concurrent.futures 模块使用说明

    Python 中 concurrent.futures 模块使用说明 转载请注明出处:https://blog.csdn.net/jpch89/article/details/87643972 文章目 ...

  5. Python全栈学习笔记day 40.5+:线程池和线程池的Python标准模块--concurrent.futures

    Python标准模块--concurrent.futures 源码:https://docs.python.org/dev/library/concurrent.futures.html #1 介绍: ...

  6. python3多线程第三方库_Python3标准库:concurrent.futures管理并发任务池

    Python Python开发 Python语言 Python3标准库:concurrent.futures管理并发任务池 1. concurrent.futures管理并发任务池 concurren ...

  7. python manager模块_Python 并发模块

    Python 并发模块 multiprocessing 介绍 multiprocessing 是一个用与 threading 模块相似API的支持产生进程的包. multiprocessing 包同时 ...

  8. Python 并发编程:PoolExecutor 篇

    个人笔记,如有疏漏,还请指正. 使用多线程(threading)和多进程(multiprocessing)完成常规的并发需求,在启动的时候 start.join 等步骤不能省,复杂的需要还要用 1-2 ...

  9. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自 Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mul ...

最新文章

  1. 项目由于装运点不同交货拆分解决方案
  2. @qualifier注解_常见的 Spring 注解概览
  3. Qt中视图的缩放对应缩略图中矩形框的缩放
  4. vmware view由哪些组件组成?
  5. vba下标越界9怎么解决_铝模气泡怎么解决?看9个常见问题防治
  6. 猴子排序的期望复杂度推导(雾)
  7. DSP技术是利用计算机或,DSP技术是什么?
  8. 网络工程师(软考)心得
  9. UMLChina公众号文章精选(20220918更新精选)
  10. Kali Linux教程(1)
  11. 服务器返回消息为空iOS
  12. 使用ASP.NET MVC Web SignalR 构建单身聊天室(一)
  13. [Excel]常用技巧
  14. 单片机C语言中关键词code的作用
  15. 计算机类sci查重,SCI科研写作:国自然标书查重方法
  16. 靶机渗透练习60-digitalworld.local:FALL
  17. Detection of Malicious Code Variants Based on Deep Learning--论文
  18. 基于python的国内外研究现状怎么写_如何写国内外研究现状
  19. 怎样处理 Safari 移动端对图片资源的限制
  20. 第9天 用css画一个五边形和一个六边形

热门文章

  1. directx比较java,在DirectX中绘制多个2d形状
  2. 浪潮英信服务器虚拟化,浪潮英信服务器NX5440M4
  3. bagging与boosting原理详解
  4. 数据60秒 | 金仓K宝带你秒懂数据库(下)
  5. 北京Yeslab安全实验室 现任明教教主
  6. k8s-资源编排(YAML)的使用
  7. 学妹问单例模式,我用最通俗易懂的讲解让她学会了
  8. 360全景拼接 opencv_OpenCV中的全景拼接例程
  9. [翻译] ogre 2.0 移植手册 - 2 改变:对象、场景和节点
  10. linux wubi安卓,安卓搜狗输入法升级:五笔前所未有的爽!