2016-08-03 35 views
0

在Ubuntu 14.04上使用python3(3.4.3),我创建了一个Forker类,我在两个不同的进程中使用它来创建子进程。下面是Forker类:如何避免在Linux中停止python进程?

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) 

但是,我仍然得到一对夫妇停止活动蟒蛇过程:

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> 

也许有什么东西我可以改变,以避免这些死进程?

+0

可能是父进程在杀死所有孩子之前死亡。你确定所有的孩子都被杀死了吗? – Devavrata

+0

我相信父进程不会被杀死!他们在开始后仍然跑步。 – Alex

回答

2

标记为<defunct>的进程称为僵尸进程。系统使他们处于不活动状态,以便他们的父母在完成运行后读取他们的状态。

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

  • 恨不得在来电者不久完毕以后。调用者可以为SIGCHLD设置一个处理程序,以警告它的一个孩子刚刚结束,或者只是不时地轮询他们
  • 只是忽略它们。如果调用者在叉时间明确忽略SIGCHLD(signal(SIGCHLD, SIG_IGN);),则孩子将立即被移除(不存在失效状态),但父母无法等待他们。
1

退出的孩子是<defunct>,直到父母等待他们。 既然你叫等待reap_children()只有当你fork()一个新的孩子,退出的孩子留<defunct>,直到下一个孩子分叉。为了早日摆脱它们,您可以在更早的时间拨打reap_children()(即等待)。通常,这是通过SIGCHLD信号的处理程序完成的。