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

Posted

技术标签:

【中文标题】Python多处理池:完成任何k个作业后终止进程【英文标题】:Python Multiprocessing Pool : kill processes after any k jobs are done 【发布时间】:2021-09-05 16:47:18 【问题描述】:

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

【问题讨论】:

【参考方案1】:

使用Pool.imap_unorderedconcurrent.futures.as_completedlist 提交的任务上更容易做到这一点。无论哪种情况,解决方案都是相同的;迭代生成的迭代器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

【讨论】:

您是否刚刚为shutdown 方法发明了cancel_futures 关键字参数?我不相信concurrent.futures.Executor 提供任何终止已启动任务的方法。在尚未启动的Future 实例上调用cancel阻止它启动,但这并不完全相同。我会坚持在 multiprocessing.pool.Pool 实例上调用 terminate @Booboo: cancel_futures 是在 3.9 中引入的,所以是的,它很新,你以前不能使用它(当然,在这种情况下,你有一个所有期货的集合,所以你可以很容易地自己取消它们)。是的,它不会在中间停止任务,所以你能得到的最接近的是cancel_futures=True加上wait=False,它可以取消它可以做的事情并且不会让你阻止当前正在运行的事情;它让他们完成然后关闭商店。 terminate(或等效地,退出控制 Poolwith 块)是最激进的解决方案。 感谢您提供的信息 - 我不知道。

以上是关于Python多处理池:完成任何k个作业后终止进程的主要内容,如果未能解决你的问题,请参考以下文章

你如何让多处理池不启动新进程但也不终止当前正在运行的进程?

如何终止多处理池进程?

python多处理池:我怎么知道池中的所有工作人员何时完成?

多进程池不会在所有进程之前关闭并加入终止脚本

Python:线程进程与协程——线程池

Python 多处理:最大。池工作进程的数量?