当我在守护进程线程中调用os.fork()
时,子进程中的主线程将daemon
属性设置为True
。这非常令人困惑,因为程序一直在运行,而唯一的线程是守护进程。根据文档,如果所有线程都是守护进程,程序应该退出。在
下面是一个例子:
import os
import threading
def child():
assert not threading.current_thread().daemon # This shouldn't fail
def parent():
new_pid = os.fork()
if new_pid == 0:
child()
else:
os.waitpid(new_pid, 0)
t = threading.Thread(target=parent)
t.setDaemon(True)
t.start()
t.join()
cpythis在实现中的bug?在
您正在显式地等待线程结束。线程是否是守护程序对
t.join()
没有影响。{t>,除非子进程^再次终止。在不过,我不确定分叉线的行为,所以我不能告诉你为什么你会经历你所做的事情。在
出现这种行为的原因是守护进程只与主线程相关。{{cd2>的值在cd2}中是硬编码的。在
请参阅此处的相关源代码:
https://github.com/python/cpython/blob/2.7/Lib/threading.py#L1097
所以在fork之后,只有一个线程,因此它是主线程。在
这意味着它永远不能是守护进程线程。在
我不能向您指出源代码之外的任何文档,但它肯定是一个bug—如果您的期望得到满足,它将是另一个bug。在
fork和线程之间的交互非常复杂,正如我所提到的:不要在fork之前混合它们。在
相关问题 更多 >
编程相关推荐