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

Ale*_*lex 3 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 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
Run Code Online (Sandbox Code Playgroud)

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

self.fork(my_function, my_data)
Run Code Online (Sandbox Code Playgroud)

但是,我仍然得到一些已失效的 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>
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*sta 9

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

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

  • 在他们完成后不久在呼叫者中等待他们。调用者可以为 SIGCHLD 设置一个处理程序,以警告它的一个孩子刚刚结束,或者只是不时地轮询他们
  • 只是忽略它们。如果调用者signal(SIGCHLD, SIG_IGN);在 fork 时显式地忽略 SIGCHLD ( ),则子进程将被立即删除(没有失效状态),但父进程没有更多的方法来等待它们。