python并发模块之concurrent.futures(一)

news/2024/7/18 6:41:40

 

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=1as executor:
    future = executor.submit(pow, 3231235)
    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 ThreadPoolExecutor
import 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_completed
import 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_completed
import 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('主线程结束')

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


http://www.niftyadmin.cn/n/3484046.html

相关文章

”不安全的服务器,不支持 FTP over TLS“ 配置 vsftpd 使用 SSL / TLS

为了解决暴露在公网的 FTP 传输的安全,我们必须对 vsftpd 进行配置 ssl 一、建立证书 1.检查 vsftpd 是否支持 ssl 模块 # ldd $(which vsftpd) | grep ssl 2.建立专门给vsftpd使用的凭证数据。CentOS有一个建立凭证的地方/etc/pki/tls/certs/ # cd /etc/pki/tls/ce…

大白话5分钟带你走进人工智能-第一节开篇介绍以及线性回归简介篇

一、前述 一直以来都想用很简介或者很普通的方式聊下各个算法的前龙后脉,让更多的人都能看懂算法的过程。查看了网上很多博客,不是写的太笼统就是抄来抄去,根本没有阅读的欲望,很是让人浪费时间,也学不到真正的东西&am…

ubuntu安装nimble

ubuntu安装nimble 简介:一款好用的rtmp、rtsp、cmaf流服务器 ubuntu安装步骤参考文档: https://wmspanel.com/nimble/install#os_ubuntu 修改API的端口参考文档: https://wmspanel.com/nimble/param#management_port 步骤一: 添…

Linux之解决命令行cat命令中文乱码

临时解决cat中文乱码 cat test.txt | iconv -f GBK -t UTF-8转载于:https://www.cnblogs.com/jums/p/10589960.html

vnstat流量监控

vnstat流量监控 参考连接: http://www.vpser.net/manage/vnstat.html http://www.vpser.net/manage/iftop.html CentOS需要先安装EPEL第三方源,安装好EPEL后执行命令:yum install vnstat 即可安装上vnstat,安装过程可能会要求输入…

从 0 开始手写一个 Mybatis 框架,三步搞定!

阅读本文大概需要 3 分钟。MyBatis框架的核心功能其实不难,无非就是动态代理和jdbc的操作,难的是写出来可扩展,高内聚,低耦合的规范的代码。本文完成的Mybatis功能比较简单,代码还有许多需要改进的地方,大家…

linux桌面系统打开隐藏文件命令

ubuntu或centos桌面版打开隐藏文件命令 打开隐藏路径命令: xdg-open 路径

jenkins复制项目到新项目

1:由于要做系统扩展,实现方式和以前的项目差不多,修改个别参数即可,但是不想从新做一个,克隆项目实现 例如实现复制43_dc 转载于:https://blog.51cto.com/9025736/2368425