python - 可以终止作为池中工作人员的 python 进程吗?
问题描述
每个工作人员运行一个长时间的 CPU 密集型计算。计算取决于可以随时更改的参数,即使在计算过程中也是如此。如果发生这种情况,计算的最终结果将变得毫无用处。我们不控制计算代码,因此我们无法发出停止信号。我们能做什么?
- 什么都没有:让工人完成它的任务,然后以某种方式认识到结果是不正确的,必须重新计算。这意味着继续使用处理器以获得无用的结果,可能会持续很长时间。
- 不要使用池:根据需要创建和加入进程。然后我们可以终止无用的进程并创建另一个进程。我们甚至可以限制同时存在的进程数量。不幸的是,我们不会重用流程。
- 找到终止和替换池工作者的方法:终止池工作者是否可能?Pool create 会取代终止的池吗?如果没有,是否有在池中创建新工作人员的外部方法?
解决方案
鉴于严格的“无法更改计算代码”限制(它可以防止间歇性地检查失效),您最好的选择可能是#2。
在这种情况下,您提到的#2 的缺点(“不幸的是,我们不会重用进程。”)并不是什么大不了的事。当一个进程完成的工作相对于启动进程的开销来说很小时,重用进程是一个问题。但这听起来像是您在谈论运行数秒或更长时间的进程;一个新进程的成本fork
(在大多数 UNIX 上是默认的)只是其中的一小部分,而spawn
一个进程(在 MacOS 和 Windows 上的默认行为)通常仍然以几分之一秒的时间来衡量。
为了比较:
选项#1是浪费的;如果您接近用完您的核心,并且任何频率都发生失效,您不希望让核心无限期地在垃圾上徘徊。
选项 #3,即使它有效,也只是巧合,并且可能会在新版本的 Python 中中断,因为明确杀死工人的行为不是记录在案的功能。
推荐阅读
- javascript - 无法通过 id 复制和重命名元素
- c++ - 本地编译的 C++ 代码循环不正确
- swift - 在 Swift 5 中,如何在 UIAlert 中连续执行动作?
- gem5 - 为什么在 gem5 中添加 DPRINTF(XXX 调试标志失败,并出现“错误:'XXX' 未在此范围内声明”?
- javascript - 如何通过本机反应传递子屏幕的参数?
- python - 制作一个每 5 分钟截取一次屏幕截图并将其发布到特定频道的不和谐机器人。我是新人,不太确定下一步该做什么
- python - 是否可以在给定 2 个参数的 csv 中找到某物的名称?Python
- performance - okhttp3 中的 connectTimeout 会减慢响应时间
- google-cloud-platform - [已解决]Pubsub 推送订阅不确认消息
- angular - 以角度减少完整轮廓垫形式场的高度