在 ProcessPoolExecutor 中杀死进程 [重复]
Posted
技术标签:
【中文标题】在 ProcessPoolExecutor 中杀死进程 [重复]【英文标题】:Killing processes in ProcessPoolExecutor [duplicate] 【发布时间】:2020-09-22 00:03:04 【问题描述】:我正在使用 Python 的 ProcessPoolExecutor
并行运行多个进程并在其中任何一个完成时处理它们。然后我查看他们的输出,只要其中至少一个给出令人满意的答案,我就想退出程序。
但是,这是不可能的,因为在调用 pool.shutdown(wait=False)
时,我必须等待 pool
中的所有活动任务完成,然后才能退出我的脚本。
有没有办法杀死所有剩余的活跃孩子并退出? 另外,是否有更好的方法可以在至少有一个孩子返回我们等待的答案时立即停止?
【问题讨论】:
【参考方案1】:你在做什么不是很清楚,但执行者认为我完全是错误的工具。
multiprocessing.Pool 似乎更合适,并允许完全按照您的要求进行操作:您可以迭代 imap_unordered
(或 apply_async
并轮询结果),一旦您拥有了您正在寻找的内容terminate()
池然后join()
它。
【讨论】:
谢谢!terminate()
也会杀死所有提交的进程吗?
其实就是terminate
的整个点。另一种选择是close()
,它会阻止提交新任务并指示工人在完成任务时退出,但terminate()
会阻止工人,即使他们正在工作中。
from concurrent.futures import ProcessPoolExecutor, as_completed exc = ProcessPoolExecutor(max_workers=4) processes = [exc.submit(job, arg) for job, args in jobs_tuple] for job in as_completed(processes): if job.result() == 'meets_a_condition': break exc.shutdown(wait=False) `以上是关于在 ProcessPoolExecutor 中杀死进程 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中使用 ProcessPoolExecutor 的运行调用数不正确
在完成所有任务之前关闭 ProcessPoolExecutor 的异步
如何选择 ProcessPoolExecutor 进程的 python 解释器?
如何使用 asyncio 和 concurrent.futures.ProcessPoolExecutor 在 Python 中终止长时间运行的计算(CPU 绑定任务)?
如何使用 asyncio 和 concurrent.futures.ProcessPoolExecutor 在 Python 中终止长时间运行的计算(CPU 绑定任务)?