【问题标题】:Stop python sub-process leaving behind dead 'python' process停止 python 子进程留下死的“python”进程
【发布时间】:2015-01-18 21:03:05
【问题描述】:

我正在开发一个 python 程序,它必须运行(可能很大)数量的其他 python 程序(用于一些负载测试)。其中一些是短暂的,而另一些会持续更长时间。我希望短暂的那些在它们完成后终止并消失,但每个似乎都会留下一个死的“(Python)”进程,直到原始程序完成。

平台是 OSX,Python 2.7.6。

以下是显示问题的简单演示程序:

#!/usr/bin/env python
# Child Process: Started by parent...
import time
print "Hello from child!"
time.sleep(10)
print "Child finished."
exit(0)

还有父程序:

#!/usr/bin/env python
# Parent process:
import subprocess, time
print "Starting Child..."
child = subprocess.Popen( "./child.py" )
print "Parent Process... hanging around."
time.sleep(30)
exit(0)

我使用“./parent.py”从终端运行“父”程序。这是输出(如预期的那样):

Starting Child...
Parent Process... hanging around.
Hello from child!
Child finished.

最初,“ps”命令显示如下:

'ps' 命令显示:

782 ttys002    0:00.03 python ./parent.py
783 ttys002    0:00.02 python ./child.py

这是有道理的……父进程已经启动了子进程。

10 秒后,孩子按预期完成,然后 'ps' 显示:

782 ttys002    0:00.03 python ./parent.py
783 ttys002    0:00.00 (Python)

'783' 然后挂起直到父进程完成,即使 python 程序已经完成了“exit(0)”。

一旦完成,有什么方法可以真正终止/摆脱这个过程?我认为如果我在很长一段时间内启动数百甚至数千个短期进程可能会成为问题。

我已经尝试过 subprocess()、Popen(如图所示),并且还使用过 fork() 和 execl(),但它们总是以相同的行为结束。

【问题讨论】:

    标签: python subprocess popen


    【解决方案1】:

    你应该在某个时候调用 child.wait。

    【讨论】:

    • 我猜这就是问题所在。它看起来像一个等待重复的已失效过程。阅读退出代码,它会消失
    • 就是这样 - 谢谢!我已经在 C 中完成了这项工作,但出于某种原因,我认为 Python 会处理它。再次阅读文档并注意到“Popen.wait()”方法。
    • 其实我不希望我的主进程等待子进程(我想要“一劳永逸”),而且用 child.poll() 轮询有点乱,所以我创建了一个启动孩子的新线程。然后线程可以在 'child.wait()' 中等待,并且主线程可以继续。这似乎工作正常。
    • @Jeremy 每次创建新的 Popen 实例时,python 都会轮询已经存在的孩子。请参阅 subprocess._cleanup。
    • 您可以保留已启动子代的列表并在父脚本末尾调用 child.wait。线程中不需要。
    猜你喜欢
    • 2020-06-02
    • 1970-01-01
    • 2012-09-19
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多