停止 python sub-process 留下死亡 'python' 进程

Stop python sub-process leaving behind dead 'python' process

我正在开发一个 python 程序,该程序必须 运行 一个(可能很大)数量的其他 python 程序(用于某些负载测试)。其中一些是 short-lived,而另一些则持续更长时间。我希望 short-lived 那些在完成后终止并消失,但每个人似乎都留下了一个死的“(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)

和 parent 程序:

#!/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)

I 运行 来自终端的 "parent" 程序带有“./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

这是有道理的...parent 已经启动了 child 进程。

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

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

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

是否有任何方法可以在完成后实际终止/摆脱此过程?我认为如果我在很长一段时间内启动数百甚至数千个 short-lived 进程,这可能会成为一个问题。

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

你应该在某个时候打电话给 child.wait。