停止python子进程,留下死的';python';过程

停止python子进程,留下死的';python';过程,python,subprocess,popen,Python,Subprocess,Popen,我正在开发一个python程序,它必须运行(可能是大量的)其他python程序(用于一些负载测试)。其中一些是短期的,而另一些则持续更长的时间。我希望短生命的程序在完成后终止并消失,但在原始程序完成之前,每个程序似乎都会留下一个死的(Python)进程 平台是OSX,Python 2.7.6 以下是显示问题的简单演示程序: #!/usr/bin/env python # Child Process: Started by parent... import time print "Hello fr

我正在开发一个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”从终端运行“parent”程序。以下是输出(如预期的那样):

最初,“ps”命令显示:

782 ttys002    0:00.03 python ./parent.py
783 ttys002    0:00.02 python ./child.py
“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程序已经执行了“退出(0)”

一旦这个过程完成,有没有办法真正终止/摆脱它?我想如果我在很长一段时间内启动数百个甚至数千个短期流程,这可能会成为一个问题


我尝试过subprocess()、Popen(如图所示),还使用了fork()和execl(),但它们最终的行为都是一样的

你应该给child打电话。等一下。

我想这就是问题所在。这看起来像是一个等待重复的已不存在的过程。阅读退出密码,它会消失在它的-谢谢!我已经在C中完成了这项工作,但出于某种原因,我认为Python可以处理它。只需再次阅读文档并注意到“Popen.wait()”方法。事实上,我不希望我的主进程等待子进程(我希望使用“fire and forget”),并且使用child.poll()进行轮询有点混乱,因此我创建了一个新线程来启动子进程。然后线程可以在“child.wait()”中等待,主线程可以继续。“这似乎还可以。”Jeremy每次创建一个新的Popen实例时,python都会轮询已经存在的child。请参阅子流程。\ u cleanup。您可以保留已启动子进程的列表,并在父脚本的末尾调用child.wait。在线程中没有必要使用。