Python 多处理池:完成任何 k 个作业后终止进程

Python Multiprocessing Pool : kill processes after any k jobs are done

我有一个函数,我使用 Pool.starmap() 调用 n 进程。我想在 n 中的任何 k 完成后终止所有进程。我该如何实施?

使用 Pool.imap_unorderedconcurrent.futures.as_completed 提交的 list 任务更容易完成。无论哪种情况,解决方案都是相同的;将生成的迭代器迭代 k 次(例如使用 itertools.slice),然后终止 Pool(在 Executor 的情况下,调用 shutdown(cancel_futures=True),或者确保取消手动完成所有未完成的任务)。例如,而不是:

with Pool() as pool:
    results = pool.starmap(func, makes_tuples())

将所有结果收集为单个操作并消除您停止处理中途的能力,您可以:

from itertools import islice

# Defined at global scope as simple wrapper to allow non-starmap functions to
# be used with iterators of argument tuples
def starcall_func(args):
    return func(*args)

...

with Pool() as pool:
     results = list(islice(pool.imap_unordered(starcall_func, makes_tuples()), k))

# When with exits, pool is terminated automatically, and only k results were collected