在多处理中取消sys.exit之后的连接

时间:2014-05-29 13:21:38

标签: python signals multiprocessing

在OSX上,我使用multiprocessing.Process创建一个进程树。当我向父进程发送信号时,进程进入连接状态:

[INFO/MainProcess] process shutting down
[INFO/MainProcess] calling join() for process Process-1

我已经使用信号处理程序捕获信号,然后调用sys.exit(1)。在sys.exit(1)之前是否可以调用某些内容来阻止此进程等待其子进程?

2 个答案:

答案 0 :(得分:3)

您可以通过在子进程上将daemon属性设置为True来避免这种情况。来自multiprocessing.Process文档(强调我的):

  

守护程序

     

进程的守护进程标志,一个布尔值。必须在调用start()之前设置它。

     

初始值继承自创建过程。

     

当进程退出时,它会尝试终止所有守护进程的子进程。

     

请注意,不允许守护进程创建子进程。否则,一个守护进程会离开它的孩子   如果父进程退出时它被终止,则成为孤立的。   另外,这些不是Unix守护进程或服务,它们是正常的   如果非守护进程将终止(并且不加入)的进程   流程已经退出。

因此,如果p.daemon == True,您的父进程只会杀死您的子进程,而不是join它。但请注意,您的守护进程无法创建自己的子进程(如文档中所述)。

答案 1 :(得分:1)

我使用os._exit(1)代替sys.exit(1)来解决这个问题。