可以终止作为池中工作人员的 python 进程吗?

Can one terminate a python process which is a worker in a pool?

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

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

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

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

比较:

选项 #1 很浪费;如果您的核心快要用完了,并且失效以任何频率发生,您不希望无限期地让核心在垃圾上嘎嘎作响。

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