首页 > 解决方案 > 可以终止作为池中工作人员的 python 进程吗?

问题描述

每个工作人员运行一个长时间的 CPU 密集型计算。计算取决于可以随时更改的参数,即使在计算过程中也是如此。如果发生这种情况,计算的最终结果将变得毫无用处。我们不控制计算代码,因此我们无法发出停止信号。我们能做什么?

  1. 什么都没有:让工人完成它的任务,然后以某种方式认识到结果是不正确的,必须重新计算。这意味着继续使用处理器以获得无用的结果,可能会持续很长时间。
  2. 不要使用池:根据需要创建和加入进程。然后我们可以终止无用的进程并创建另一个进程。我们甚至可以限制同时存在的进程数量。不幸的是,我们不会重用流程。
  3. 找到终止和替换池工作者的方法:终止池工作者是否可能?Pool create 会取代终止的池吗?如果没有,是否有在池中创建新工作人员的外部方法?

标签: pythonpython-multiprocessingpool

解决方案


鉴于严格的“无法更改计算代码”限制(它可以防止间歇性地检查失效),您最好的选择可能是#2。

在这种情况下,您提到的#2 的缺点(“不幸的是,我们不会重用进程。”)并不是什么大不了的事。当一个进程完成的工作相对于启动进程的开销来说很小时,重用进程是一个问题。但这听起来像是您在谈论运行数秒或更长时间的进程;一个新进程的成本fork(在大多数 UNIX 上是默认的)只是其中的一小部分,而spawn一个进程(在 MacOS 和 Windows 上的默认行为)通常仍然以几分之一秒的时间来衡量。

为了比较:

选项#1是浪费的;如果您接近用完您的核心,并且任何频率都发生失效,您不希望让核心无限期地在垃圾上徘徊。

选项 #3,即使它有效,也只是巧合,并且可能会在新版本的 Python 中中断,因为明确杀死工人的行为不是记录在案的功能。


推荐阅读