Python分叉进程不会死

时间:2012-04-13 10:16:15

标签: python

我已经看过像这样的几个问题,但是在尝试了各种变体检查孩子是否还活着并退出了孩子们的过程之后,我简化了问题,但仍然不起作用。

使用sys.exit(0)退出分叉进程时出错了吗? 还有另一种方法可以杀死它。问题是,我不能让父母杀死进程,因为它不会知道他们何时完成了工作。

起初我以为这是因为在退出(Python run system command and then exit... won't exit)之前执行了一个系统命令,但我甚至在简化版中删除了它,因为给定的解决方案也不起作用。

以下是一个例子:

import sys
import os
import time

children = []

for i in range(0,3):    
    pid = os.fork()

    if pid == -1:
        continue
    elif pid == 0:
        # Do work...
        print 'Child %d spawned' % os.getpid()
        sys.exit(0)     
    else:
        children.append(pid)

time.sleep(5)
for pid in children:
    proc_path = '/proc/%d' % pid
    if not os.path.exists(proc_path):
        print 'Child %d is dead' % pid
    else:
        print 'Child %d is alive' % pid

打印:

Child 27636 spawned
Child 27637 spawned
Child 27638 spawned
Child 27636 is alive
Child 27637 is alive
Child 27638 is alive

但是儿童过程应该已经死了。

在这种情况下,导致这些进程成为僵尸的原因是什么?

2 个答案:

答案 0 :(得分:4)

您必须wait()进行子进程。

请添加以下行以更正错误:

import sys
import os
import time

children = []

for i in range(0,3):    
    pid = os.fork()

    if pid == -1:
        continue
    elif pid == 0:
        # Do work...
        print 'Child %d spawned' % os.getpid()
        sys.exit(0)     
    else:
        children.append(pid)

time.sleep(5)

# ADD NEXT TWO LINES:
for pid in children:
    os.waitpid(pid, 0)

for pid in children:
    proc_path = '/proc/%d' % pid
    if not os.path.exists(proc_path):
        print 'Child %d is dead' % pid
    else:
        print 'Child %d is alive' % pid

父母必须wait()为孩子。有关详细信息,请参阅man 2 wait

在python中,您可以使用subprocess模块处理这些事情。

答案 1 :(得分:2)

要让孩子从PID表中消失,你需要在父母一方wait()

n_still_children_alive = len(children)
while n_still_children_alive > 0:
    pid, status = os.wait()
    print "Child %d died and joined" % pid
    n_still_children_alive -= 1

如果您想在Python中使用多处理,那么使用multiprocessing module而不是使用os模块会更好。