python - 所有回调完成后如何运行任务
问题描述
我正在使用 python 3 concurrent.futures。
with concurrent.futures.ProcessPoolExecutor(max_workers=os.cpu_count()) as executor:
futures = [executor.submit(do_the_work, item) for item in work_list.items()]
for i, future in enumerate(concurrent.futures.as_completed(futures)):
status = future.result()
print('DONE: count:{} result:{}'.format(i, status))
我的代码是这样写的。但是现在我需要在所有期货都完成后运行一项任务。这些期货在共享数据结构中写入数据。所以在所有这些future完成后,我需要处理共享数据结构。
我想我可以使用不同的线程构造重写代码。但是,我想知道有没有办法使用 concurrent.futures 来解决这个问题?
解决方案
正如我评论的那样,在您的for
循环终止后,您的所有期货都将完成。如果您愿意,您现在可以在同with
一块内向池提交额外的任务。下面我使用该map
方法计算 10 个数字的平方并打印结果。顺便说一句,您可以自己使用 map 方法。
with concurrent.futures.ProcessPoolExecutor(max_workers=os.cpu_count()) as executor:
for i, status in enumerate(executor.map(do_the_work, work_list.items())):
print('DONE: count:{} result:{}'.format(i, status))
但是,当然,结果将按提交项目的顺序返回,而不是按完成的顺序返回。
并执行其他任务:
import concurrent.futures
def square_number(x):
return x ** 2
with concurrent.futures.ProcessPoolExecutor(max_workers=os.cpu_count()) as executor:
futures = [executor.submit(do_the_work, item) for item in work_list.items()]
for i, future in enumerate(concurrent.futures.as_completed(futures)):
status = future.result()
print('DONE: count:{} result:{}'.format(i, status))
print(list(executor.map(square_number, range(10))))
推荐阅读
- c# - 使用字符串数组过滤实体不起作用
- android - avc 拒绝在 deamon 上转换
- ruby-on-rails - 如何下载使用builder生成的xml文件以在rails中另存为xml文件
- html - 使用浮动表格时删除 HTML 页面底部的空格
- angular - Angular 6 - HTTP 拦截器和网络 :: ERR_TIMED_OUT
- r - 如何从 Excel 导出并导入 R?
- javascript - 即使加载了 jquery ui 库,$.ui 也未定义
- java - java中的两个角硬币游戏
- angular - 具有模拟服务的单元测试组件 - 错误
- javascript - 如何使用 React Native 为 IOS 正确安装 Facebook 广告