并发期货等待任务的子集
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] 但不执行其余的。
我正在使用 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] 但不执行其余的。