并发期货等待任务的子集

Concurrent futures wait for subset of tasks

我正在使用 Python 的 concurrent.futures 框架。我已经使用 map() 函数来启动并发任务:

def func(i):
    return i*i

list = [1,2,3,4,5]
async_executor = concurrent.futures.ThreadPoolExecutor(5)
results = async_executor.map(func,list)

我只对第一个 n 结果感兴趣,并希望在第一个 n 线程完成后停止执行程序,其中 n 是一个小于输入列表。在 Python 中有什么方法可以做到这一点吗?我应该研究另一个框架吗?

您不能为此使用 map(),因为它无法停止等待结果,也无法获取已提交的期货并取消它们。但是,您可以使用 submit():

import concurrent.futures
import time

def func(i):
    time.sleep(i)
    return i*i


list = [1,2,3,6,6,6,90,100]
async_executor = concurrent.futures.ThreadPoolExecutor(2)
futures = {async_executor.submit(func, i): i for i in list}
for ii, future in enumerate(concurrent.futures.as_completed(futures)):
    print(ii, "result is", future.result())
    if ii == 2:
        async_executor.shutdown(wait=False)
        for victim in futures:
            victim.cancel()
        break

上面的代码 运行 大约需要 11 秒——它执行作业 [1,2,3,6,7] 但不执行其余的。