【问题标题】:Daemon threads vs daemon processes in PythonPython中的守护线程与守护进程
【发布时间】:2019-07-26 15:17:46
【问题描述】:

基于Python documentation,守护线程是在主线程终止时终止的线程。这似乎是守护进程的完全相反的行为,它涉及创建子进程并终止父进程以便让 init 接管子进程(也就是杀死父进程不会杀死子进程)。

那么为什么当父进程死亡时守护线程也会死亡,这是用词不当吗?我认为“守护程序”线程会在主进程终止后继续运行

【问题讨论】:

  • 守护进程是旨在永远被杀死的进程。守护线程是你永远不会杀死的线程(但是当主进程死亡时内核会杀死它们,但没有明确地这样做)。
  • 在这两种情况下,“守护程序”都是您启动并忘记的东西,只要有任何东西继续运行,它就会运行。在这两种情况下,非守护程序版本的不同之处在于它是由父级监督和控制或监控的。
  • Python 守护进程具有与 Python 守护线程相同的关闭行为。 Unix 守护进程与两者的概念不同。

标签: python multithreading process multiprocessing daemon


【解决方案1】:

只是名称在不同的上下文中表示不同的事物。

如果你不知道,像threading.Threadmultiprocessing.Process 也可以被标记为“守护进程”。您对“守护进程”的描述适合 Unix 守护进程,而不适合 Python 的守护进程。

文档还有一个关于 Process.daemon 的部分:

... 请注意,不允许守护进程创建子进程。 否则,如果一个守护进程会使其子进程成为孤儿 当其父进程退出时终止。此外,这些是 不是 Unix 守护进程或服务,它们是正常的进程 如果非守护进程已退出,则终止(并且未加入)。

Python 的守护进程和 Unix 守护进程(或 Windows“服务”)之间唯一的共同点是您可以使用它们来执行后台任务 (对于 Python:仅适用于不需要在关机时进行适当清理的任务)。

Python 将它自己的抽象层强加于操作系统线程和进程之上。 ThreadProcess 的守护进程属性是关于这个 OS-independent,Python 级别的抽象。

在 Python 级别,守护线程是在主线程退出时不加入(等待自愿退出)的线程,而守护进程是在以下情况下终止(未加入)的进程父进程退出。守护线程和进程都经历相同的行为,即在主进程或父进程关闭的情况下不等待它们的自然退出。就是这样。

注意,Windows 甚至没有像 Unix 那样的“相关进程”的概念,但是 Python 以跨平台的方式实现了这种“子”和“父”的关系。

我认为“守护”线程会在主线程之后继续运行 进程已终止。

线程不能存在于进程之外。一个进程总是托管并为至少一个线程提供上下文。

【讨论】: