在 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)
现在,由于子进程似乎已结束,因此它仍然可以被视为“已失效”进程(而父进程仍在运行)。如何真正摆脱已结束的子进程?如何更改代码?
如果您不想让父进程等待,可以使用双叉习惯用法。(参见创建守护进程时执行双分叉的原因是什么?)
基本思想是父进程(称之为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)
| 归档时间: |
|
| 查看次数: |
3055 次 |
| 最近记录: |