首页 > 解决方案 > Python中的守护线程与守护进程

问题描述

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

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

标签: pythonmultithreadingprocessmultiprocessingdaemon

解决方案


它只是名称在不同的上下文中具有不同的含义。

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

该文档还有一个关于Process.daemon

...请注意,不允许守护进程创建子进程。否则,如果守护进程在其父进程退出时被终止,它将使其子进程成为孤儿。此外,这些不是 Unix 守护进程或服务,它们是正常进程,如果非守护进程退出,它们将被终止(而不是加入)。

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

Python 将它自己的抽象层强加在操作系统线程和进程之上。Thread和的守护进程属性Process是关于这个独立于操作系统的、Python 级别的抽象。

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

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

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

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


推荐阅读