繁体   English   中英

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

[英]How to avoid defunct python processes in Linux?

在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>

也许我可以改变一些方法来避免这些已失效的过程?

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

有两种删除方法:

  • 完成通话后不久 ,在呼叫者中等待它们。 调用方可以为SIGCHLD设置处理程序,以警告其子级刚刚结束,或者不时轮询它们
  • 别理他们。 如果调用方在派生时显式忽略SIGCHLD( signal(SIGCHLD, SIG_IGN); ),则子代将被立即删除(无失效状态),但是父代没有其他方法可以等待它们。

退出的子代将<defunct>直到父代等待它们为止。 由于仅在fork()一个新孩子时才在reap_children()中调用wait ,因此退出的孩子会保持<defunct>直到下一个孩子被分叉。 为了更早地摆脱它们,您可以在更早的时候调用reap_children() (即wait )。 通常,这是通过SIGCHLD信号的处理程序完成的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM