Python 并发未来等待任务的子集

Python 并发未来等待任务的子集,python,python-3.x,asynchronous,threadpool,concurrent.futures,Python,Python 3.x,Asynchronous,Threadpool,Concurrent.futures,我正在使用Python的框架。我使用了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中有什么方法可以做

我正在使用Python的框架。我使用了
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()


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

解决方案是否必须能够终止前N个作业完成时已经启动的那些函数?或者说“在前N个工作完成后不会有新的工作开始,但是即使我们忽略了它们的结果,已经开始的工作也会被允许完成”就足够了吗?如果您需要前者,请参阅:-无法直接使用您正在使用的库。您的第二句话似乎适合我的应用。我想我可以使用计数信号量,然后在信号量达到值“n”时取消执行器。我的问题是,如果我这样做,“地图”的结果会是什么?它是否只包含前“n”个任务的结果?在计算已开始但尚未完成的任务的结果之前,它是否会阻塞?
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