Python 守护进程线程解释

Python 守护进程线程解释,python,multithreading,daemon,python-multithreading,Python,Multithreading,Daemon,Python Multithreading,在 它说: 线程可以标记为“守护线程”。这一点的意义 标志是当只有守护进程线程时,整个Python程序退出 剩下的就剩下了。初始值从创建线程继承 有没有人对这意味着什么有更清楚的解释,或者有一个实际的例子来说明将线程设置为daemonic 请给我澄清一下:因此,您唯一不会将线程设置为daemonic的情况是,当您希望它们在主线程退出后继续运行时?一些线程执行后台任务,如发送保留数据包,或执行定期垃圾收集,或其他任何任务。这些只有在主程序运行时才有用,并且在其他非守护进程线程退出后,可以将它们杀死

在 它说:

线程可以标记为“守护线程”。这一点的意义 标志是当只有守护进程线程时,整个Python程序退出 剩下的就剩下了。初始值从创建线程继承

有没有人对这意味着什么有更清楚的解释,或者有一个实际的例子来说明将线程设置为
daemonic


请给我澄清一下:因此,您唯一不会将线程设置为daemonic的情况是,当您希望它们在主线程退出后继续运行时?

一些线程执行后台任务,如发送保留数据包,或执行定期垃圾收集,或其他任何任务。这些只有在主程序运行时才有用,并且在其他非守护进程线程退出后,可以将它们杀死


如果没有守护进程线程,您必须跟踪它们,并告诉它们退出,然后程序才能完全退出。通过将它们设置为守护进程线程,您可以让它们运行并忘记它们,当您的程序退出时,任何守护进程线程都会自动终止。

假设您正在制作某种仪表板小部件。作为其中的一部分,您希望它在您的电子邮件框中显示未读邮件数。所以你做了一条小线,它会:

  • 连接邮件服务器,询问您有多少未读邮件
  • 向GUI发送更新计数的信号
  • 睡一会儿

  • 当您的小部件启动时,它将创建此线程,将其指定为守护进程,然后启动它。因为它是一个守护进程,你不必考虑它;当您的小部件退出时,线程将自动停止。

    一种更简单的方式来考虑它,也许是:当main返回时,如果有非守护进程线程仍在运行,您的进程将不会退出


    一点建议:当涉及线程和同步时,干净关机很容易出错——如果可以避免,就这样做。尽可能使用守护进程线程。

    其他海报给出了一些使用守护进程线程的示例。然而,我的建议是永远不要使用它们

    这并不是因为它们没有用处,而是因为如果你使用它们,你会经历一些不良的副作用。在Python运行时开始分解主线程中的内容之后,守护进程线程仍然可以执行,从而导致一些非常奇怪的异常

    更多信息请点击此处:


    严格地说,您永远不需要它们,它只是在某些情况下使实现更容易。

    引用Chris的话:“……当您的程序退出时,任何守护进程线程都会自动终止。”。我想这就是总结。当您使用它们时应该小心,因为当主程序执行到完成时,它们会突然终止。

    Chris已经解释了守护进程线程是什么,所以让我们来谈谈实际使用。许多线程池实现为任务工作者使用守护进程线程。工作线程是从任务队列执行任务的线程


    工作人员需要无限期地等待任务队列中的任务,因为他们不知道新任务何时出现。分配任务的线程(比如主线程)只知道任务何时结束。主线程等待任务队列变为空,然后退出。若工作线程是用户线程,即非守护进程,则程序不会终止。它将继续等待这些无限期运行的工人,即使工人们没有做任何有用的事情。标记workers守护进程线程,主线程将在处理完任务后立即杀死它们

    当第二个线程是非守护进程时,应用程序的主主线程无法退出,因为其退出条件也与非守护进程线程的退出相关联。在python中不能强制杀死线程,因此您的应用程序必须真正等待非守护进程线程退出。如果这个行为不是您想要的,那么将您的第二个线程设置为守护进程,这样它就不会阻止您的应用程序退出

    python 3仍然存在这个问题吗?文档中没有关于这些“奇怪异常”的明确信息。来自Joe的博客文章:“2015年6月更新:这是。它在Python 3.2.1和3.3中得到了修复,但该修复从未向后移植到2.x。(试图向后移植到2.7分支导致了另一个bug,因此被放弃。)守护进程线程在Python>=3.2.1中可能还可以,但在早期版本中肯定不行。“我想在这里分享我的经验:我有一个函数多次作为线程生成。在它里面,我有一个Python
    日志记录的实例,我希望在完成线程之后,所有对象(每个线程/函数的文件描述符)都会被销毁。在我的程序结束时,我看到许多输出,如
    IOError:[Errno 24]打开的文件太多:
    。通过
    lsof-p pid\u of_程序
    ,我发现FDs是开放的,即使线程/函数已经完成了它们的工作。解决办法?删除函数末尾的日志处理程序。所以
    daemonic
    线程是不可信的……这很奇怪。如果我不使用
    daemon=True
    ,并且如果我中断产生线程的进程,我会看到线程仍在运行。如果设置了此标志,主程序和线程都被终止,则不会发生相同的情况。你怎么解释?如果我需要中断一个程序,我希望所有线程也终止。你知道比这更好的方法吗?谢谢以下是文档,供进一步参考:@JoeShaw另一条评论是这样的:一点建议:当涉及线程和同步时,干净关机很容易出错-如果您可以避免,请这样做。尽可能使用守护进程线程。lol谁的建议更正确?那么,如果我有一个子线程正在执行一个设置为非deamon的文件写入操作,这是否意味着我必须使它显式退出?@san您的writer线程在完成写入后会做什么?它刚回来吗?如果是