72

我对将线程设置为守护进程意味着什么感到有些困惑。

文档是这样说的:

可以将线程标记为“守护线程”。这个标志的意义在于,当只剩下守护线程时,整个 Python 程序就退出了。初始值继承自创建线程。可以通过 daemon 属性设置标志。

我不确定这与普通线程有何不同。

这是说这个程序永远不会完成吗?

def threadfunc():
    while True:
        time.sleep(1)

threading.Thread(target=threadfunc).start()

即使主线程完成它的执行。虽然会立即完成?

def threadfunc():
    while True:
        time.sleep(1)

th = threading.Thread(target=threadfunc)
th.daemon = True
th.start()

我问是因为我有一种情况,在我的主线程中我正在调用 sys.exit(),并且进程只是挂起并且我的其他线程正在运行,因为我可以看到日志。

这是否与 sys.exit() 被调用而线程处于活动状态有什么关系?

4

3 回答 3

51

这是说这个程序永远不会完成吗?

是的,该程序不会完成,请尝试一下。

我问是因为我有一种情况,在我的主线程中我正在调用 sys.exit(),并且进程只是挂起并且我的其他线程正在运行,因为我可以看到日志。这是否与 sys.exit() 被调用而线程处于活动状态有什么关系?

是的,甚至exit不会停止其他线程,它只是SystemExit在主线程中引发。因此,虽然主线程将停止(就像它在任何其他未处理的异常上一样),但所有其他非守护线程将继续工作。

于 2010-12-01T23:19:19.363 回答
18

设置thread.daemon = True将允许主程序退出。应用程序通常会等到所有子线程完成后再完成。

于 2010-12-01T23:24:41.297 回答
7
th.daemon = True #set this thread as a Daemon Thread

您可以将守护线程视为服务,这意味着它将在您的计算机后台运行,执行不同的任务,如索引文件、解析 xml、检索新闻等,任何长时间运行的过程。

您的主线程将完成,您的守护程序仍将在后台运行,这就是您的程序(也称为主线程)完成的原因,如果您只想放置一个无限循环,您将看到您的线程仍在运行。一个守护线程的例子是垃圾回收。

于 2016-01-16T19:49:17.613 回答