python - Python中的守护线程与守护进程
问题描述
根据Python 文档,守护线程是在主线程终止后终止的线程。这似乎是守护进程的完全相反的行为,它涉及创建子进程并终止父进程以便让 init 接管子进程(也就是杀死父进程不会杀死子进程)。
那么为什么当父进程死亡时守护线程也会死亡,这是用词不当吗?我认为“守护进程”线程会在主进程终止后继续运行。
解决方案
它只是名称在不同的上下文中具有不同的含义。
如果您不知道,例如threading.Thread
,multiprocessing.Process
也可以标记为“守护进程”。您对“守护进程”的描述适合 Unix 守护进程,而不适合 Python 的守护进程。
该文档还有一个关于Process.daemon
:
...请注意,不允许守护进程创建子进程。否则,如果守护进程在其父进程退出时被终止,它将使其子进程成为孤儿。此外,这些不是 Unix 守护进程或服务,它们是正常进程,如果非守护进程退出,它们将被终止(而不是加入)。
Python 的守护进程和 Unix 守护进程(或 Windows“服务”)之间的唯一共同点是您会将它们用于后台任务(对于 Python:仅适用于不需要在关机时进行适当清理的任务的选项, 尽管)。
Python 将它自己的抽象层强加在操作系统线程和进程之上。Thread
和的守护进程属性Process
是关于这个独立于操作系统的、Python 级别的抽象。
在 Python 级别,守护线程是在主线程退出时不加入(等待自愿退出)的线程,而守护进程是在父线程退出时终止(未加入)的进程。进程退出。守护线程和进程都经历相同的行为,即在主进程或父进程关闭的情况下不等待它们的自然退出。就这样。
请注意,Windows 甚至没有像 Unix 那样的“相关进程”的概念,但 Python 以跨平台的方式实现了这种“子”和“父”的关系。
我认为“守护进程”线程会在主进程终止后继续运行。
线程不能存在于进程之外。一个进程总是托管并为至少一个线程提供上下文。
推荐阅读
- javascript - 任何人都可以检查为什么附加的代码不起作用
- python - 如何在右侧 cilck 上的 Qdoublespinbox 上向 QtCore.Qt.DefaultContextMenu 添加操作?
- java - 条纹:添加默认卡并且不覆盖旧卡
- c# - 域用户选择器窗口控件?
- scorm - 您可以通过 SCORM 课程调用外部 api
- c++ - QDockWidget 中的 QToolBox 折叠到最小尺寸
- sapui5 - 输入辅助不显示所有建议
- node.js - 如何将旧代码库中的“bcrypt-as-promised”安装到我的 ubuntu 机器上?
- php - 当数据字符串中有空格或 <> 时,fwrite 不写入文件
- html - 滚动条及其内容隐藏在 div 之外