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

Ale*_*lex 5 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...")                                        
Run Code Online (Sandbox Code Playgroud)

现在,由于子进程似乎已结束,因此它仍然可以被视为“已失效”进程(而父进程仍在运行)。如何真正摆脱已结束的子进程?如何更改代码?

pca*_*ter 6

如果您不想让父进程等待,可以使用双叉习惯用法。(参见创建守护进程时执行双分叉的原因是什么?

基本思想是父进程(称之为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)
Run Code Online (Sandbox Code Playgroud)