【发布时间】: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