求助 Python multiprocessing 守护进程为什么不允许有子进程?
本人代码如下:
import multiprocessing
import time
def process_a():
for _ in range(10):
print(“process a”)
time.sleep(1)
def process_b():
print(“process b”)
ps = []
for _ in range(3):
p = multiprocessing.Process(target=process_a)
p.daemon = True
p.start()
ps.append§
for i in ps:
i.join()
if name == ‘main’:
p = multiprocessing.Process(target=process_b)
p.daemon = True
p.start()
p.join()
运行报错:AssertionError: daemonic processes are not allowed to have children
想问一下 multiprocessing 是出于什么原因,决定守护进程不能再创建子进程?谢谢
求助 Python multiprocessing 守护进程为什么不允许有子进程?
这个问题问得好。简单说,Python的multiprocessing模块不允许守护进程(daemon进程)创建子进程,主要是为了防止产生“孤儿进程”。
当你把一个进程设置为daemon=True,主程序退出时,这个守护进程会被强制终止。如果守护进程自己又创建了子进程,主程序退出、守护进程被“杀掉”时,这些子进程就会失去父进程,变成“孤儿”,继续在系统里运行,造成资源泄漏和不可控的状态。
所以,multiprocessing在设计上就加了这个限制。你可以在创建子进程前,先把父进程的daemon属性设为False,或者在主程序里用join()等所有子进程结束,避免它们变成孤儿。
核心就一句:这是为了防止主进程退出后产生无人管理的孤儿进程。
总结建议:主进程需要管理好子进程的生命周期。
Note that a daemonic process is not allowed to create child processes. Otherwise a daemonic process would leave its children orphaned if it gets terminated when its parent process exits. Additionally, these are not Unix daemons or services, they are normal processes that will be terminated (and not joined) if non-daemonic processes have exited.
设置环境变量 export PYTHONOPTIMIZE=1
ldconfig

