2013-05-06 75 views
0

在我看来,在Python中,没有必要收获僵尸进程。在python中没有必要收获僵尸进程吗?

例如,在下面的代码

import multiprocessing 
    import time 

    def func(msg): 
     time.sleep(2) 
     print "done " + str(msg) 

    if __name__ == "__main__": 
     for i in range(10): 
      p = multiprocessing.Process(target=func, args=('3')) 
      p.start() 
      print "child"+str(i) 
     print "parent" 
     time.sleep(100) 

当所有的子进程退出,父进程仍在运行 此时,我检查了使用ps -ef 过程中,我发现没有不存在的过程。

这是否意味着在Python中,没有必要收获僵尸进程?

回答

0

在看看图书馆之后 - 尤其是multiprocessing/process.py - ,我看到

    Process.start()
  1. ,有_current_process._children.add(self)它增加了启动过程,以列表/设置/不管,
  2. 一上面几行,有一个_cleanup()轮询和放弃终止的进程,删除僵尸。

但是,这并不能解释为什么你的代码不会产生僵尸,因为孩子们等待一段时间终止,所以父母的start()调用还没有注意到。

+0

我不明白你最后一句的意思,根据你的1和2,僵尸是由Process类自己清理的吗? – user1944267 2013-05-06 11:42:39

+0

@ user1944267是的,但是在某些情况下,在这种情况下不能满足要求。我试图在棚子里放一些灯光,但光线不够明亮。 – glglgl 2013-05-06 11:45:30

+0

此外,如果我想在子进程退出后执行某些操作,那么如何使其成为可能?像'C' – user1944267 2013-05-06 11:46:15

0

这些进程实际上并不是僵尸,因为它们应该成功终止。 您可以将子进程设置为deamonic,以便在主进程终止时它们将终止。

+0

我认为你是混淆进程和线程。 – glglgl 2013-05-06 11:02:22

+0

我不这么认为:)还是可能会误解一些东西。 – pypat 2013-05-06 12:16:26