当前位置:
首页 > Python基础教程 >
-
Python3标准库:concurrent.futures管理并发任务池(2)
.format(n))
return n / 10
def done(fn):
if fn.cancelled():
print('{}: canceled'.format(fn.arg))
elif fn.done():
error = fn.exception()
if error:
print('{}: error returned: {}'.format(
fn.arg, error))
else:
result = fn.result()
print('{}: value returned: {}'.format(
fn.arg, result))
if __name__ == '__main__':
ex = futures.ThreadPoolExecutor(max_workers=2)
print('main: starting')
f = ex.submit(task, 5)
f.arg = 5
f.add_done_callback(done)
result = f.result()
不论由于什么原因,只要认为Future“完成”,就会调用这个回调,所以在使用它之前必须检查传入回调的对象的状态。
1.5 撤销任务
如果一个Future已经提交但还没启动,那么可以调用它的cancel()方法将其撤销。
- from concurrent import futures
- import time
- def task(n):
- print('{}: sleeping'.format(n))
- time.sleep(0.5)
- print('{}: done'.format(n))
- return n / 10
- def done(fn):
- if fn.cancelled():
- print('{}: canceled'.format(fn.arg))
- elif fn.done():
- print('{}: not canceled'.format(fn.arg))
- if __name__ == '__main__':
- ex = futures.ThreadPoolExecutor(max_workers=2)
- print('main: starting')
- 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, t in reversed(tasks):
- if not t.cancel():
- print('main: did not cancel {}'.format(i))
- ex.shutdown()
cancel()返回一个布尔值,指示任务是否可用撤销。
1.6 任务中的异常
如果一个任务产生一个未处理的异常,那么它会被保存到这个任务的Future,而且可以通过result()或exception()方法得到。
- from concurrent import futures
- def task(n):
- print('{}: starting'.format(n))
- raise ValueError('the value {} is no good'.format(n))
- ex = futures.ThreadPoolExecutor(max_workers=2)
- print('main: starting')
- f = ex.submit(task, 5)
- error = f.exception()
- print('main: error: {}'.format(error))
- try:
- result = f.result()
- except ValueError as e:
- print('main: saw error "{}" when accessing result'.format(e))
如果在一个任务函数中抛出一个未处理的异常后调用了result(),那么会在当前上下文中再次抛出同样的异常。
1.7 上下文管理器
执行器会与上下文管理器合作,并发的运行任务并等待它们都完成。当上下文管理器退出时,会调用执行器的shutdown()方法。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式