python - Python 中的守护线程与守护进程

标签 python multithreading process multiprocessing daemon

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

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

最佳答案

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

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

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

... Note that a daemonic process is not allowed to create child processes. Otherwise a daemonic process would leave its children orphaned if it gets terminated when its parent process exits. Additionally, these are not Unix daemons or services, they are normal processes that will be terminated (and not joined) if non-daemonic processes have exited.

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

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

在Python级别,守护线程是一个在主线程退出时不会加入(等待自动退出)的线程,而守护进程是一个在以下情况下终止(未加入)的进程:父进程退出。守护线程和进程都经历相同的行为,因为如果主进程或父进程关闭,则不会等待它们的自然退出。仅此而已。

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

I would think that "daemon" threads would keep running after the main process has been terminated.

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

关于python - Python 中的守护线程与守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57222905/

相关文章:

python - Pyspark 在查找前一行时按组迭代数据帧

python - 为Python中的数据帧列表中的单个数据帧赋值

c++ - Visual Studio 2010 中的 boost::thread 编译错误

winapi - 如何知道 Windows 上的子进程状态和资源使用情况?

C#:为什么运行 Java.exe 的进程运行良好,但窗口没有返回任何输出?

python - pytorch如何在克隆张量后计算梯度

java - 如何在spring Mvc中使用多线程提高性能

java - ArrayBlockingQueue,如果在添加元素时队列已满,则删除队列头

node.js - 错误: listen EADDRINUSE after restart

python 逗号将值分隔成千位,不带尾随零