如何使用twisted和multiprocessing.Process创建僵尸进程?
在Python中,使用twisted的循环调用、multiprocessing.Process和multiprocessing.Queue,是否有可能创建一个僵尸进程?如果可以的话,怎么做呢?
1 个回答
6
一个僵尸进程是指一个已经完成的进程,但启动它的进程还没有注意到它的完成。处理这个问题的责任在于Twisted进程,它需要清理自己的子进程。
如果你用spawnProcess
来启动进程,通常一切都会按预期工作。然而,正如Twisted的bug #733(这个问题早已修复)所描述的,当你想把Twisted和其他启动进程的功能结合使用时,会遇到很多麻烦的边缘情况,因为Python的API历史上让信号处理器之间的协作变得困难。
最近版本的代码已经解决了这些问题,但我认为在以下情况下你可能仍然会遇到这个bug:
- 你使用的Twisted版本早于10.1。
- 你使用的Python版本早于2.6。
- 你没有构建Twisted的本地扩展模块(如果你是从开发版本或解压的压缩包工作,而不是安装版本,可以通过运行
python setup.py build_ext -i
来解决这个问题)。 - 你正在使用像
popen
或subprocess
这样的模块。
希望升级Twisted或运行适当的命令能解决你眼前的问题,但你仍然应该考虑使用spawnProcess
,因为这样可以让你把进程的输出当作反应器事件循环中的普通事件来处理。