python – 在多处理池中处理工作者死亡
我有一个简单的服务器:
如果我运行这个,我会得到类似的东西:
然后我在服务器运行时杀了47292.启动了新的工作进程,但服务器的输出是:
池仍在尝试向旧工作进程发送请求. 我已经完成了在服务器和工作程序中捕获信号的一些工作,我可以获得稍微好一点的行为,但服务器似乎仍在等待关闭死亡的孩子(即.pool.join()永远不会结束) . 处理工人死亡的正确方法是什么? 如果没有工人死亡,那么从服务器进程中正常关闭工作人员似乎才有效. (在Python 3.4.4上,但如果有帮助的话,很高兴升级.) 更新: 也许相关的是,当问题发生时,终止服务器进程将使工作进程保持运行. 最佳答案
此行为来自multiprocessing.Pool的设计.当你杀死一个工人时,你可能会杀死一个持有call_queue.rlock的工人.当这个进程在持有锁时被终止时,其他进程将不再能够读入call_queue,因为它无法再与其工作者通信而破坏了Pool.
所以实际上没有办法杀死一个工人,并确保你的游泳池之后仍然没问题,因为你可能会陷入僵局. multiprocessing.Pool不处理工人死亡.您可以尝试使用concurrent.futures.ProcessPoolExecutor(使用稍微不同的API)来处理默认情况下进程的失败.当进程在ProcessPoolExecutor中死亡时,整个执行程序将关闭并返回BrokenProcessPool错误. 请注意,此实现中还有其他死锁,应在 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |