首页 > 解决方案 > 所有回调完成后如何运行任务

问题描述

我正在使用 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 来解决这个问题?

标签: pythonpython-3.xmultithreadingmultiprocessing

解决方案


正如我评论的那样,在您的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))))

推荐阅读