Python 多处理池:完成任何 k 个作业后终止进程
Python Multiprocessing Pool : kill processes after any k jobs are done
我有一个函数,我使用 Pool.starmap() 调用 n
进程。我想在 n
中的任何 k
完成后终止所有进程。我该如何实施?
使用 Pool.imap_unordered
或 concurrent.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
我有一个函数,我使用 Pool.starmap() 调用 n
进程。我想在 n
中的任何 k
完成后终止所有进程。我该如何实施?
使用 Pool.imap_unordered
或 concurrent.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