在守护进程线程中创建的进程的主线程本身就是守护进程,这是否是Python错误?

2024-04-26 06:41:56 发布

您现在位置:Python中文网/ 问答频道 /正文

当我在守护进程线程中调用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?在


Tags: import程序childtruenew进程osdef
2条回答

This is very confusing, since the program keeps running while the only thread is a daemon. According to the docs, if all the threads are daemons the program should exit.

您正在显式地等待线程结束。线程是否是守护程序对t.join()没有影响。{t>,除非子进程^再次终止。在

不过,我不确定分叉线的行为,所以我不能告诉你为什么你会经历你所做的事情。在

出现这种行为的原因是守护进程只与主线程相关。{{cd2>的值在cd2}中是硬编码的。在

请参阅此处的相关源代码:

https://github.com/python/cpython/blob/2.7/Lib/threading.py#L1097

所以在fork之后,只有一个线程,因此它是主线程。在

这意味着它永远不能是守护进程线程。在

我不能向您指出源代码之外的任何文档,但它肯定是一个bug—如果您的期望得到满足,它将是另一个bug。在

fork和线程之间的交互非常复杂,正如我所提到的:不要在fork之前混合它们。在

相关问题 更多 >