为什么主进程和子进程在主进程发生异常后不退出?
Why do main- and child-process not exit after exception in main?
#coding=utf8
from multiprocessing import Process
from time import sleep
import os
def foo():
print("foo")
for i in range(11000):
sleep(1)
print("{}: {}".format(os.getpid(), i))
if __name__ == "__main__":
p = Process(target=foo)
#p.daemon = True
p.start()
print("parent: {}".format(os.getpid()))
sleep(20)
raise Exception("invalid")
主进程抛出异常,子进程和主进程保持运行。为什么?
当 MainProcess 关闭时,non-daemonic 子进程只是加入。这发生在 _exit_function()
中,它注册了 atexit.register(_exit_function)
。有兴趣的可以去multiprocessing.util.py
查一查
您还可以在开始进程之前插入 multiprocessing.log_to_stderr(logging.DEBUG)
以查看日志消息:
parent: 9670
foo
[INFO/Process-1] child process calling self.run()
9675: 0
9675: 1
...
9675: 18
Traceback (most recent call last):
File "/home/...", line 26, in <module>
raise Exception("invalid")
Exception: invalid
[INFO/MainProcess] process shutting down
[DEBUG/MainProcess] running all "atexit" finalizers with priority >= 0
[INFO/MainProcess] calling join() for process Process-1
9675: 19
#coding=utf8
from multiprocessing import Process
from time import sleep
import os
def foo():
print("foo")
for i in range(11000):
sleep(1)
print("{}: {}".format(os.getpid(), i))
if __name__ == "__main__":
p = Process(target=foo)
#p.daemon = True
p.start()
print("parent: {}".format(os.getpid()))
sleep(20)
raise Exception("invalid")
主进程抛出异常,子进程和主进程保持运行。为什么?
当 MainProcess 关闭时,non-daemonic 子进程只是加入。这发生在 _exit_function()
中,它注册了 atexit.register(_exit_function)
。有兴趣的可以去multiprocessing.util.py
查一查
您还可以在开始进程之前插入 multiprocessing.log_to_stderr(logging.DEBUG)
以查看日志消息:
parent: 9670
foo
[INFO/Process-1] child process calling self.run()
9675: 0
9675: 1
...
9675: 18
Traceback (most recent call last):
File "/home/...", line 26, in <module>
raise Exception("invalid")
Exception: invalid
[INFO/MainProcess] process shutting down
[DEBUG/MainProcess] running all "atexit" finalizers with priority >= 0
[INFO/MainProcess] calling join() for process Process-1
9675: 19