2016-08-03 32 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信號的處理程序完成的。