在多进程中,sys.exit后如何取消join
在OSX系统上,我用multiprocessing.Process创建了一棵进程树。当我给父进程发送一个信号时,这个进程会进入一个等待状态:
[INFO/MainProcess] process shutting down
[INFO/MainProcess] calling join() for process Process-1
我已经用信号处理器捕捉到了这个信号,然后调用了sys.exit(1)来退出。请问在调用sys.exit(1)之前,有没有什么方法可以让这个进程不再等待它的子进程呢?
2 个回答
3
你可以通过把子进程的 daemon
属性设置为 True
来避免这个问题。根据 multiprocessing.Process
的文档(我强调的部分):
daemon
这个进程的守护进程标志,是一个布尔值。必须在调用
start()
之前设置这个值。初始值是从创建它的进程继承来的。
当一个进程退出时,它会尝试终止所有它的守护子进程。
注意,守护进程不能创建子进程。否则,如果守护进程在其父进程退出时被终止,它的子进程就会变成孤儿进程。此外,这些守护进程并不是 Unix 的守护进程或服务,它们是普通进程,如果非守护进程退出了,它们会被终止(而不是被加入)。
所以如果 p.daemon == True
,你的父进程会直接杀掉子进程,而不是去 join
它。不过要注意,你的守护进程不能创建自己的子进程(正如文档中所说的)。
1
我通过使用 os._exit(1)
来解决这个问题,而不是用 sys.exit(1)
。