【发布时间】:2015-02-20 04:56:11
【问题描述】:
我正在学习 Python 中的多处理,同时我发现守护进程和非守护进程之间的这种奇怪行为与主进程有关。 我的代码:
import multiprocessing
import time
def worker(name,num):
print name, 'Starting'
time.sleep(num)
print name, 'Exiting'
if __name__ == '__main__':
print 'main starting'
p1=multiprocessing.Process(target=worker, args=("p1",7,))
p2=multiprocessing.Process(target=worker, args=("p2",5,))
p2.daemon=True
p1.start()
p2.start()
time.sleep(4)
print 'main exiting'
我得到的输出是:
main starting
p1 Starting
p2 Starting
main exiting
p1 Exiting
预期输出:
main starting
p1 Starting
p2 Starting
main exiting
p2 Exiting
p1 Exiting
经过几次搜索,我找到了this answer,并在我的代码中插入了以下行。
logger = multiprocessing.log_to_stderr(logging.INFO)
我得到的输出是,
main starting
[INFO/p1] child process calling self.run()
p1 Starting
[INFO/p2] child process calling self.run()
p2 Starting
main exiting
[INFO/MainProcess] process shutting down
[INFO/MainProcess] calling terminate() for daemon p2
[INFO/MainProcess] calling join() for process p2
[INFO/MainProcess] calling join() for process p1
p1 Exiting
[INFO/p1] process shutting down
[INFO/p1] process exiting with exitcode 0
据我了解
- 当主进程退出时,它会终止其所有子守护进程。 (可以在这里看到)
- 主进程无法在其所有子非守护进程退出之前退出。
但是在这里,为什么主进程在 p1 退出之前试图关闭?
- p1 启动并休眠 7 秒。
- p2 启动并休眠 5 秒。
- 主进程休眠 4 秒。
- 主进程在 4 秒后唤醒并等待 p1 退出。
- p2 在 5 秒后唤醒并退出。
- p1 在 7 秒后唤醒并退出。
- 主进程退出。
对于上述计划来说,上述时间线不是正常的吗?
谁能解释一下这里发生了什么以及为什么?
编辑
在代码末尾添加p1.join() 行后,我得到以下输出:
main starting
[INFO/Process-1] child process calling self.run()
p1 Starting
[INFO/Process-2] child process calling self.run()
p2 Starting
main exiting
p2 Exiting
[INFO/Process-2] process shutting down
[INFO/Process-2] process exiting with exitcode 0
p1 Exiting
[INFO/Process-1] process shutting down
[INFO/Process-1] process exiting with exitcode 0
[INFO/MainProcess] process shutting down
【问题讨论】: