没有合适的资源?快使用搜索试试~ 我知道了~
使用future处理并发1
资源详情
资源评论
资源推荐
使future处并发
future指种对象,表示异步执
的操作。这个
concurrent.futures 模块的主要
特是 ThreadPoolExecutor 和
ProcessPoolExecutor 类
这两个类在内部维护着个作
线程或进程池,以及要执的任
务队。
这两个类实现的接能分别在
同的线程或进程中执可调的
对象。
使作的线程数实化
ThreadPoolExecutor 类;
executor.__exit__ 法会调
executor.shutdown(wait=True)
法,它会在所有线程都执完
毕前阻塞线程。
future在哪
future是 concurrent.futures 模
块和 asyncio 包的重要组件,可
是,作为这两个库的户,我们
有时却到future。
从 Python 3.4 起, 标 准 库 中
有 两 个 名 为 Future 的 类:
concurrent.futures.Future 和
asyncio.Future。
这两个类的作相同:两个
Future 类的实都表示可能已经
完成或者尚未完成的延迟计算。
future封装待完成的操作,可以
放队,完成的状态可以查
询,得到结果(或抛出异常)后
可以获取结果(或异常) 。
通常情况下应该创建
future,只能由并发框架
(concurrent.
futures 或 asyncio)实化。
future表示终将发的事情,
确定某件事会发的唯式是
执的时间已经排定。
因此,只有排定把某件事交给
concurrent.futures.
Executor 类 处 时, 才 会
创 建 concurrent.futures.Future
实 。
Executor.
submit() 法的参数是个可调
的对象,调这个法后会为
传的可调对象排期,并返回
个future。
客户端代码应该改变future的
状态,并发框架在future表示的
延迟计算结束后会改变future的
状态,我们法控制计算何时
结束。
法
两种future都有 .done() 法,
这个法阻塞,返回值是布尔
值,指明future链接的可调对
象是否已经执。
两个 Future 类都
有 .add_done_callback() 法
客户端代码通常会询问future
是否运结束,是会等待通
知。
future运结束后会调指定的
可调对象。
.result() 法。在future运结
束后调的话,这个法在两个
Future 类中的作相同:返回可
调对象的结果,或者重新抛出
执可调的对象时抛出的异
常。
如果future没有运结束,result
法在两个 Future 类中的为
相差很。
对concurrency.futures.Future
实来说,调 f.result() 法
会阻塞调所在的线程,直到
有结果可返回。
此时,result 法可以接收可选
的 timeout 参数,如果在指定的
时间内future没有运完毕,会
抛出 TimeoutError 异常。
asyncio.
Future.result 法持设定超
时时间,在那个库中获取future
的结果最好使 yield from 结
构。
对 concurrency.futures.Future
实能这么做。
Executor.map
返回值是个迭代,迭代的
__next__ 法调各个future的
result 法,因此我们得到的是
各个future的结果,future
本身。
concurrent.futures.as_complet
ed 函数
参数是个future表,返回值
是个迭代,在future运结
束后产出future。
executor.submit 法排定可调
对象的执时间,然后返回
个future,表示这个待执的操
作。
as_completed 函数在future运
结束后产出future。
调 future.result() 法绝会
阻塞
阻塞型I/O和GIL
CPython 解释本身就是线程
安全的,因此有全局解释锁
(GIL) ,次只允许使个
线程执 Python 字节码。
个 Python 进程通常能同时
使多个 CPU 核。
Jython 和 IronPython 没有这种
限制。
PyPy 也有 GIL
编写 Python 代码时法控制
GIL;过,执耗时的任务
时,可以使个内置的函数或
个使 C 语编写的扩展释放
GIL。
这样做会极地增加库代码的复
杂度,因此多数库的作者都
这么做。
标准库中所有执阻塞型 I/O 操
作的函数,在等待操作系统返回
结果时都会释放GIL。
这意味着在 Python 语这个层
次上可以使多线程, I/O 密
集型 Python 程序能从中受益:
个 Python 线程等待络响应
时,阻塞型 I/O 函数会释放
GIL,再运个线程。
使concurrent.futures模块启
动进程
这个模块实现的是真正的并计
算
因为它使
ProcessPoolExecutor 类把作
分配给多个 Python 进程处。
如果需要做 CPU 密集型处,
使这个模块能绕开 GIL,
所有可的 CPU 核。
ProcessPoolExecutor 和
ThreadPoolExecutor 类都实现
通的 Executor 接,因此
使concurrent.futures 模块能
特别轻松地把基于线程的案转
成基于进程的案。
对简单的途来说,这两个实现
Executor 接的类唯值得注意
的区别是
ThreadPool Executor.__init__
法 需 要 max_workers 参
数, 指 定 线 程 池 中 线 程 的
数 。
对 I/O 密集型处来说,可以在
个ThreadPoolExecutor 实
中使 10 个、100 个或 1000 个
线程
最佳线程数取决于做的是么
事,以及可内存有多少,因此
要仔细测试才能找到最佳的线程
数。
在ProcessPoolExecutor 类
中,那个参数是可选的,且
多数情况下使——默认值是
os.cpu_count() 函数返回的
CPU 数。
因为对 CPU 密集型的处来
说,可能要求使超过 CPU
数的职程。
如果使 Python 处 CPU 密
集型作,应该试试
PyPy(http://pypy.org) 。
实验Executor.map法
若想并发运多个可调的对
象,最简单的式是使示
17-3 中过的 Executor.map
法。
for 循环中的 enumerate 函数会
隐式调 next(results),这个函
数会在(内部)表示第个任
务(loiter(0))的 _f future上调
_f.result() 法。
result 法会阻塞,直到future
运结束,因此这个循环每次迭
代时都要等待下个结果做好准
备。
Executor.map 函数于使,
过有个特性可能有,也可能
没,具体情况取决于需求:这
个函数返回结果的顺序与调开
始的顺序致。
把 Executor.submit 法和
futures.as_completed 函数结合
起来使
管提交的顺序,有结果就获取
处,阻塞。
executor.map 灵活
因为 submit 法能处同的
可调对象和参数,
executor.map 只能处参数
同的同个可调对象。
此外,传给
futures.as_completed 函数的
future集合可以来多个
Executor 实,如些由
ThreadPoolExecutor 实创
建,另些由
ProcessPoolExecutor 实创
建。
显示下载进度并处错误
使 TQDM 包(https://
github.com/noamraph/tqdm)
实现的本动画进度条。
能处任何可迭代的对象,成
个迭代;使这个迭代
时,显示进度条和完成全部迭代
预计的剩余时间。
为计算预计剩余时间,tqdm
函数要获取个能使 len 函数
确定的可迭代对象,或者在
第个参数中指定预期的元素数
。
必须使 futures.as_completed
函数和 asyncio.as_ completed
函数 ,这样tqdm 函数才能在每
个future运结束后新进度。
使futures.as_completed函数
futures.as_completed 函数特
别有的惯法:构建个字
典,把各个future映射到其他数
据(future运结束后可能有
)上。
线程和多进程的替代案
如果
futures.ThreadPoolExecutor 类
对某个作业来说够灵活,可能
要使 threading 模块中的组件
如说使 queue 模块
(https://docs.python.org/3/
library/queue.html)创建线程安
全的队,在线程之间传递数
据。
futures.ThreadPoolExecutor 类
已经封装这些组件。
对 CPU 密集型作来说,要启
动多个进程,规避 GIL。创建多
个进程最简单的式是,使
futures.ProcessPoolExecutor
类。
如果使场景较复杂,需要
级的具。multiprocessing 模
块(https://docs.python.org/
3/library/
multiprocessing.html)的API 与
threading 模块相仿,过作业
交给多个进程处。
还能解决协作进程遇到的最挑
战:在进程之间传递数据。
对简单的程序来说,可以
multiprocessing 模块代替
threading 模块,少改动即
可。
首席程序IT
- 粉丝: 30
- 资源: 305
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab的考虑设备动作损耗的配电网分布式电压无功优化源码.zip
- 互联网网络科技类网站模板整站打包下载.zip
- 电脑操作系统软件下载网站模板打包整站下载.zip
- 创维e910 mt8685刷机包
- 网站整站模板竞技游戏类网站模板打包下载.zip
- 14 Day of the Dragon King - Mary Pope Osborne.png
- 【Redis开发】资源Redis-v6.0.20.zip
- 《STM32单片机+DHT11温湿度++光敏电阻+蜂鸣器+OLED屏幕》源代码
- (完整版)银行计算机储蓄系统需求分析.doc
- 图像超分辨率FSRCNN的最优SSIM和PSNR的模型权重文件(x2、x3、x4)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0