如何避免Linux中已失效的python进程?

如何避免Linux中已失效的python进程?,python,linux,python-3.x,Python,Linux,Python 3.x,使用Ubuntu 14.04上的python3(3.4.3),我创建了一个Forker类,我在两个不同的进程中使用它来创建子进程。以下是Forker类: class Forker(object): def __init__(self): self.active_children = [] def reap_children(self): while se

使用Ubuntu 14.04上的python3(3.4.3),我创建了一个
Forker
类,我在两个不同的进程中使用它来创建子进程。以下是
Forker
类:

class Forker(object):
    def __init__(self):     
        self.active_children = []            

    def reap_children(self):                              
        while self.active_children:                        
            pid,stat = os.waitpid(0, os.WNOHANG)       
            if not pid: break
            self.active_children.remove(pid)                

    def fork(self, function, *args, **kwargs):         
        self.reap_children()

        child_pid = os.fork()
        if child_pid == 0:
            function(*args, **kwargs)
            os._exit(0)
        else:                                               
            self.active_children.append(child_pid)

        return child_pid
在两个不同的Linux进程中,我从这个类派生,然后调用,例如:

self.fork(my_function, my_data)
但是,我仍然有几个已失效的python进程:

alexand+ 24777 24735  0 20:40 pts/29   00:00:00 [python3] <defunct>
alexand+ 24838 24733  0 20:40 pts/29   00:00:00 [python3] <defunct>
alexand+2477247350 20:40分/29 00:00:00[蟒蛇3]
alexand+24838247330 20:40分/29 00:00:00[蟒蛇3]

也许我可以改变一些东西来避免这些失效的进程?

退出的子进程在父进程等待它们之前都是
。 由于您仅在
fork()
一个新子项时才调用wait in
eaw_children()
,因此退出的子项将一直保留
,直到下一个子项被分叉。要更早地摆脱它们,您可以在更早的时间调用
eaw_children()
(即等待)。通常,这是通过SIGCHLD信号的处理程序完成的。

标记为
的进程称为僵尸进程。系统将它们保持在失效状态,以允许它们的父级在完成运行后读取它们的状态

有两种方法可以删除它们:

  • 完成后不久,在来电者中等待他们。调用方可以为SIGCHLD设置一个处理程序,以警告它的一个子项刚刚结束,或者只是不时轮询它们

  • 别理他们。如果调用方在fork时间明确忽略SIGCHLD(
    signal(SIGCHLD,SIG_IGN);
    ),则将立即删除子项(无失效状态),但父项无法再等待它们

可能是父进程在杀死所有子进程之前被杀死。您确定所有子进程都将被杀死吗?我确定父进程不会被杀死!它们在启动后仍然运行。“但是父级没有更多的方法等待它们”——您能否详细说明一下为什么
Popen.wait()
在这种情况下不再工作?它是否在内部使用
signal.sigwait([signal.SIGCHLD])
?@balu是的,因为这是底层操作系统允许的方式。