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

Daemon线程说明

  •  296
  • Corey Goldberg  · 技术社区  · 18 年前

    在the Python documentation 它说:

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

    有人对这意味着什么有更清晰的解释吗?或者有一个实际的例子显示你会在哪里设置线程 daemonic ?

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

    9 回复  |  直到 7 年前
        1
  •  500
  •   C. K. Young    18 年前

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

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

        2
  •  32
  •   John Fouhy    18 年前

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

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

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

        3
  •  19
  •   Joe Shaw OscarRyz    6 年前

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

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

        4
  •  18
  •   Jonathan    18 年前

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

    这并不是因为它们没有用,而是因为如果你使用它们,你会遇到一些不良的副作用。在Python运行时开始拆除主线程中的东西后,守护进程线程仍然可以执行,从而导致一些非常奇怪的异常。

    更多信息请点击此处:

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

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

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

        5
  •  12
  •   Amit    10 年前

    我还将在这里添加一些内容,我认为守护进程线程让大多数人感到困惑的原因之一(至少对我来说是这样)是因为这个词的Unix上下文 dameon .

    在Unix术语中,这个词 daemon 指曾经产生的过程;继续在后台运行,用户可以继续使用前台进程做其他事情。

    在Python线程上下文中,创建时的每个线程都在后台运行,无论是 半神半人精灵 或 non-daemon ,区别在于这些线程如何影响主线程。

    当你开始一个 非守护进程 线程,它开始在后台运行,您可以执行其他操作,但是,在所有这些操作之前,您的主线程不会退出 非守护进程 线程已经完成了它们的执行,所以在某种程度上,你的程序或主线程被阻塞了。

    具有 半神半人精灵 线程——它们仍然在后台运行,但有一个关键区别,即它们不会阻塞主线程。 一旦主线程完成其执行&;程序退出,所有剩余的 半神半人精灵 线将被收割。这使得它们对于您想在后台执行但希望这些操作在主应用程序退出后立即自动退出的操作非常有用。

    需要注意的一点是,你应该清楚自己在做什么 半神半人精灵 线程,当主线程退出时,它们退出的事实可能会给你带来意想不到的惊喜。优雅地清理垃圾的方法之一 半神半人精灵 线程将使用 Threading Events 将事件设置为退出处理程序,并检查事件是否在线程内设置,然后相应地从线程函数中断。

    另一件令人困惑的事情 半神半人精灵 threads是python文档中的定义。

    这个标志的意义是整个Python程序退出 当只剩下守护进程线程时

    简单地说,这意味着如果你的程序既有 半神半人精灵 和 非守护进程 线程主程序将被阻塞,并等待所有线程 非守护进程 已经退出,一旦它们退出主线程也将退出。这句话也暗示了,但乍一看并不清楚的是,所有 半神半人精灵 一旦主线程退出,线程将自动退出。

        6
  •  11
  •   Bass    15 年前

    引用Chris的话:“…当你的程序退出时,任何守护进程线程都会自动被杀死。”。我认为这概括了这一点。使用它们时应该小心,因为当主程序执行完毕时,它们会突然终止。

        7
  •  7
  •   daparic    8 年前

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

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

        8
  •  4
  •   Rohit    5 年前

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