如何使用python fork避免失效进程?

时间:2016-08-04 18:48:46

标签: python python-3.x

在python3中,我正在创建分叉的子进程,我想 - 我正确地退出了。这是一些代码示例:

import os

child_pid = os.fork()
if child_pid == 0:
    print("I am in the child with PID "+str(os.getpid()))
    # doing something
    a = 1+1
    print("Ending child with PID "+str(os.getpid()))
    os._exit(0)
else:   
    #parent process      
    os.waitpid(-1, os.WNOHANG)
    import time
    for x in range(100):
        time.sleep(1)
        print("waiting...")                                        

现在,由于儿童过程似乎已经结束,它仍然可以被看作是一个“已经不复存在”的过程。进程(父进程仍在运行时)。如何真正摆脱那个结束的儿童过程?如何更改代码?

1 个答案:

答案 0 :(得分:1)

如果您不希望父级等待,您可以使用双叉习语。 (见What is the reason for performing a double fork when creating a daemon?

基本思路是父进程(称之为P)分叉一个子(C1),它立即再次创建另一个子进程(C2),然后退出。在这种情况下,由于C2的父级已死,init进程将继承C2并等待它。您仍需要在C1进程中P等待,否则C1将成为僵尸。但是,C1仅运行很短的时间,因此P进程不会等待很长时间。运行C2的代码可以根据需要花费尽可能多的时间,而不关心它是否在P之前或之后完成。

另一个想法是处理孩子退出时发生的SIGCHILD信号。来自https://mail.python.org/pipermail/tutor/2003-December/026748.html

import os,signal

def handleSIGCHLD():
  os.waitpid(-1, os.WNOHANG)

signal.signal(signal.SIGCHLD, handleSIGCHLD)