在Python文档中 它说:
一个线程可以被标记为“守护线程”。这其中的意义 标志表示当只有守护进程线程时,整个Python程序退出 是离开了。初始值继承自创建的线程。
有人对这意味着什么有更清楚的解释吗?或者有一个实际的例子说明在哪里将线程设置为守护线程?
澄清它为我:所以唯一的情况下,你不会设置线程为守护进程,是当你想让他们继续运行后,主线程退出?
在Python文档中 它说:
一个线程可以被标记为“守护线程”。这其中的意义 标志表示当只有守护进程线程时,整个Python程序退出 是离开了。初始值继承自创建的线程。
有人对这意味着什么有更清楚的解释吗?或者有一个实际的例子说明在哪里将线程设置为守护线程?
澄清它为我:所以唯一的情况下,你不会设置线程为守护进程,是当你想让他们继续运行后,主线程退出?
当前回答
我还将在这里补充我的一些内容,我认为daemon线程让大多数人感到困惑的原因之一(至少对我来说是这样)是因为dameon这个词的Unix上下文。
在Unix术语中,daemon一词指的是曾经生成的进程;保持在后台运行,用户可以移动到前台进程做其他事情。
在Python线程上下文中,创建的每个线程都在后台运行,无论是守护进程还是非守护进程,区别在于这些线程如何影响主线程。
当你启动一个非守护线程时,它开始在后台运行,你可以执行其他事情,然而,你的主线程不会退出,直到所有这些非守护线程完成它们的执行,所以在某种程度上,你的程序或主线程被阻塞了。
使用守护线程,它们仍然在后台运行,但有一个关键区别,即它们不会阻塞主线程。 只要主线程完成执行并且程序退出,所有剩余的守护线程将被收割。这使得它们对于那些希望在后台执行但希望这些操作在主应用程序退出时自动退出的操作非常有用。
需要注意的一点是,您应该知道您在守护线程中究竟在做什么,它们在主线程退出时退出的事实可能会给您意想不到的惊喜。优雅地清理守护进程线程的一种方法是使用Threading Events将事件设置为退出处理程序,并检查事件是否在线程内部设置,然后相应地中断线程函数。
关于守护线程的另一件令人困惑的事情是python文档中的定义。
这个标志的意义在于整个Python程序退出 当只剩下守护线程时
简单地说,这意味着如果你的程序同时有守护进程和非守护进程线程,主程序将被阻塞并等待所有非守护进程退出,一旦它们退出主线程也将退出。这句话还暗示(乍一看不清楚),一旦主线程退出,所有守护线程都将自动退出。
其他回答
引用克里斯的话:“……当您的程序退出时,所有守护进程线程将自动被杀死。”我想这就是总结。在使用它们时要小心,因为当主程序执行到完成时,它们会突然终止。
其他帖子给出了一些使用守护进程线程的示例。然而,我的建议是永远不要使用它们。
这并不是因为它们没有用处,而是因为如果你使用它们,你会经历一些不好的副作用。在Python运行时开始删除主线程中的内容之后,守护线程仍然可以执行,从而导致一些非常奇怪的异常。
更多信息:
https://joeshaw.org/python-daemon-threads-considered-harmful/
https://mail.python.org/pipermail/python-list/2005-February/343697.html
严格地说,你永远不需要它们,它只是在某些情况下使实现更容易。
也许可以用一种更简单的方式来考虑:当main返回时,如果有非守护进程线程仍在运行,则您的进程将不会退出。
一点建议:当涉及线程和同步时,干净关机很容易出错——如果可以避免,就这样做。尽可能使用守护线程。
当第二个线程不是daemon线程时,应用程序的主主线程不能退出,因为它的退出条件也绑定到非daemon线程的退出。在python中线程不能被强制杀死,因此你的应用程序将不得不等待非daemon线程退出。如果这种行为不是您想要的,那么将第二个线程设置为守护进程,这样它就不会阻止应用程序退出。
创建Daemon线程时:
您需要一个低优先级的线程 你的线程执行特定于后台的任务,更重要的是, 当您希望该线程在所有用户线程完成任务后立即结束时。
Daemon线程服务的一些例子:Java中的垃圾收集,MS Word中的字数检查器,介质中的自动保护程序,并行文件下载应用程序中的文件下载计数器等。