在多进程中,sys.exit后如何取消join

3 投票
2 回答
2297 浏览
提问于 2025-04-18 07:56

在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)

撰写回答