代码之家  ›  专栏  ›  技术社区  ›  Corey Goldberg

守护进程线程解释

  •  193
  • Corey Goldberg  · 技术社区  · 16 年前

    Python documentation 它说:

    标志是当只有守护进程线程时,整个Python程序退出

    daemonic ?

    为我澄清一下:所以你唯一不会设置线程的情况是 恶魔的 ,是您希望它们在主线程退出后继续运行的时间?

    7 回复  |  直到 5 年前
        1
  •  500
  •   C. K. Young    16 年前

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

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

        2
  •  32
  •   John Fouhy    16 年前

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

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

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

        3
  •  19
  •   Joe Shaw OscarRyz    4 年前

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

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

    更多信息请点击此处:

    https://joeshaw.org/python-daemon-threads-considered-harmful/

    https://mail.python.org/pipermail/python-list/2005-February/343697.html

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

        4
  •  18
  •   Jonathan    16 年前

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

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

        5
  •  12
  •   Amit    8 年前

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

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

        6
  •  11
  •   Bass    13 年前

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

        7
  •  7
  •   daparic    6 年前

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

        8
  •  4
  •   Rohit    3 年前

    我还将在这里补充我的几点,我认为守护进程线程让大多数人感到困惑(至少对我来说是这样)的部分原因是这个词的含义不太清楚 dameon .

    daemon 指在后台生成并保持运行的进程,用户可以使用前台进程转移到其他内容。

    在Python线程上下文中,创建时的每个线程都在后台运行,无论其 守护进程 non-daemon ,区别在于这些线程如何影响主线程。当你有一个 线程,主线程将不会退出,直到所有这些 非守护进程 线程已经完成了它们的执行,所以在某种程度上你的主线程被阻塞了。

    具有 线程仍然在后台运行,但有一个关键区别,即它们不会阻止主线程,并且在主线程完成并退出所有 守护进程 线程将被收获。这使得它们对于您想要异步执行的操作非常有用,但是一旦主应用程序退出,这些操作也应该退出。

    需要注意的一点是,你应该清楚自己在做什么 守护进程

    另一件让人困惑的事 守护进程

    当只剩下守护进程线程时

    守护进程 非守护进程 一旦退出,主线程也将退出。这句话也暗示了但乍一看并不清楚的是 守护进程 一旦主线程退出,线程将自动退出。