区分python中的守护线程和非守护线程

我上周尝试了 Python 线程。
储蓄和不储蓄有很大区别。

守护线程。

当主题出现时,它就停止了。

不管你完成与否。

适合后台任务,例如日志记录。

设置方法:threading.Thread(daemon=True)。

非守护线程。

主线程必须等待其完成才能退出。

默认为非托管。

适合需要完成的任务,比如写文件。

该示例是用户输入 EXIT 的位置。

我朋友用Python写爬虫。

它使用守护线程来运行日志。

主线程捕获数据,守护线程很快停止工作。

没问题。

场景1 :用户登录EXIT。

主线程在看到 EXIT 时退出。

魔丝毫不在意,只是退却。

这很正常。

场景2 :未输入EXIT。

主线程卡在那里等待。

恶魔线程仍在运行。

这行不通。

所以要小心来源。

守护线程意外停止,文件未正确关闭,造成麻烦。

使用尝试...最后。

线程的同步也要注意。

当护理人员和非护理人员争夺资源时,就会发生一些事情。

您必须使用锁。

翻译器的局限性也存在。

当守护线程终止时,它可能最终停止工作。

atexit注册的函数可能无法被调用。

总结一下:
无论如何,保存都适合背景。

不保存必须等待并且必须结束。

在示例中,tr 是监护人,tw 是默认的非监护人。

当 tw 停止时,tr 也停止。

算了。

java中守护线程与非守护线程的区别

说实话,当我第一次接触到守护线程的概念时,在调试Java应用程序时,我发现代码可以运行但突然崩溃了。
后来查资料发现,项目完成主要工作后,只剩下几条妖盲工作的线程了。
为此,JVm觉得没有必要喂它们,所以干脆安静了。
感觉就像你已经清理了你的女族长,突然你想回家。
他的工具还在,但如果真的离开了,他就无能为力了。

有趣的线程是典型的 JVM 垃圾收集守护线程。
当你编写代码时你可能知道它不存在,但如果没有它,你的 Java 程序甚至无法运行。
就像手机上的操作系统一样,您不必担心它如何运行。
无论如何都要跑起来,不然连微信都发不了。

我不明白为什么我们要创建这种看不见的线程。
后来在项目中遇到,需要在后台监控某个服务的状态。
如果使用非恶魔线程,如果作业挂起,没有人会关心监控线程,僵尸项目就会成为现实。
如果你把电线转向恶魔,那就不同了。
当主程序退出时,它也会退出,至少不会减慢退出速度。

使用真正的守护线程有点极端,因为如果守护线程在运行时退出时中断执行关键操作,数据可能会丢失。
我曾经有一个朋友写了一个爬虫,使用线程守护程序来保存数据库。
结果,主程序突然崩溃,所有信息都丢失了。
他非常担心,几乎想杀了我。
所以现在我们的团队决定所有涉及数据持久性和用户交互的关键操作都应该使用线程,而不是守护进程。

数据我记得从Java 9 开始,官方对守护进程续集的行为做了一些调整。
例如,当前任务将尝试在守护线程退出之前完成。
但我不会详细说明。
我建议您检查一下新版本的改进。
不管怎样,我的经验是,如果不能使用守护线程,至少可以比使用守护线程运行更安全。

关于python多线程的一些问题。

哈,你的洞察力很棒,但是让我帮助你了解守护线程,这样你就不会感到困惑。

假设按照您提到的那样加入。
这确实是一件好事。
你举个例子就很清楚了:当没有添加join时,主线程完成工作后将被删除。
无论子线程是否被覆盖,命令行都会先退出。
所以如果你看结果,主线程先打印完该部分,然后它忽略子线程,子线程必须自己缓慢运行。
跑完后,他花了几秒钟的时间打出了这串文字。
添加join时,主线程是等待结束的leader。
他说:“兄弟们,先别出去,等我把事情办完之后,你们就可以走了。
”主线程在那里等待。
当两个子线程都报告时,主线程本身就被认为完成了,然后发出命令行。
这是可以理解的吗?
但是Damon Thread,这个名字听起来有点“等等我”,但事实并非如此。
守护线程不被任何人“覆盖”,它“服务”人们。
在Java中,当一个线程成为守护线程时,它对系统说:“我的线程是后台服务,如果主线程挂了我就需要退出。
不用担心我是否完成了。
”当主线程停止工作时,系统看到后说:“哦,主线程死了,这些跟随主线程的守护线程,快点吧!”他说。
如果您的守护线程完成运行,系统将强制它为您关闭。
当JVM启动时,考虑主线程,就是主线程,然后启动其他子线程。
如果这些子线程是保姆,那么当 JVM 停止时,这些守护线程将一起消亡,无论它们在忙什么。

所以当你说“等待意味着子线程等待主线程,如果你死了我也死”,这是相反的。
主线程必须“拥有”或“承载”守护线程。
如果主线程死了,守护线程就什么都没有了,也会随之死掉。
想一想,如果反之亦然,如果主线程死了而守护线程继续运行,那么等待还有什么意义呢?要被视为“维护”,它必须遵循主线程。

让我告诉你我遇到的一个陷阱:当我运行后台任务时,我会创建一个线程来处理耗时的数据同步。
由于主界面不会因在后台运行而延迟,因此我想将其设置为守护线程。
结果怎么样?用户点击关闭,但程序没有响应!检查了半天,发现线程没有运行完,系统就关闭了。
如果添加join或者让子线程自己检测JVM运行时状态,主程序能够正常退出就完美了。

简单来说,Join控制了线程的执行顺序,保证主线程和子线程同步。
守护线程是指线程与主程序之间的连接。
而当主节目结束时,一定是《为爱而死》。
两者的作用不同,不要混淆。
到这里你就差不多明白了,尤其是连接部分,非常清晰。
在保护方面稍微调整一下你的想法。
请记住,主线程引导守护线程。

什么是守护线程 和普通线程的区别

是的,没错。
想一想。
如果你在 2 02 2 年用 Java 编写一个程序,你的 main 方法将是主线程。
如果你在里面创建一个新线程,比如使用new Thread(),它将是一个普通线程。
执行没有完成。
关闭 IDE 或按 Ctrl+C 不会关闭整个程序。
常规线程仍然需要完成其工作。

但是打开线程并使用Thread.currentThread().setDaemon(true);如果将其设置为守护线程,情况会有所不同。
如果你再次查看该程序,主线程将退出。
守护线程无论执行是否完成都会被中断。

我记得刚学习的时候写了一个小程序,忘记设置守卫了。
结果,主线程完成工作后终止,而后台线程仍然存在。
我很困惑,为什么我不能关闭它?后来我才知道,必须要设置看守。

如果您打开了 1 00 个常规线程,并且没有一个线程设置为守护程序,并且主线程被终止并且所有常规线程都在那里运行,则 JVM 可能会挂起。
然而,如果你打开1 00个守护线程并且主线程退出,它们都会退出,JVM可能会优雅退出。

所以守护线程是一种跟随主线程的线程,一旦完成就不再管它。
对于常规线程,必须等待执行完成才能退出。
2 02 2 年的 Java 版本也会出现这种情况。