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

说白了,守护线程和非守护线程的区别就两个字:无论发生什么。
当主线程离开时,守护线程直接GG,非守护线程必须等待它完成。
展开来说,有以下三个要点: 我先说最重要的一点。
恶魔线程是“孤儿线程”。
主线程退出后,无论走到哪一步,它都会立即被杀死。
去年我们使用监控系统,并使用守护进程作为日志线程。
如果程序崩溃了,它会默默退出,以免留下一堆半日志。
还有一点是,非守护线程是“手动买家”,主线程必须等到它完成工作后才能离开。
比如文件处理线程,你就不想写到一半就放弃吧?还有另一个重要的细节。
他们默认都是非监护人。
如果您犯了一个错误,程序可能会卡在后台(就像无休止的打印示例)。

一开始我以为守护线程可能会完成当前的任务然后退出,但后来发现根本不是这样的。
译者直接把它当作垃圾回收了。
等等,还有一件事。
如果非守护线程被卡住,主线程也会被卡住。
这比魔线突然断开还要烦人。

注意:使用守护线程来处理资源清理特别容易出现问题。
例如,如果您打开一个文件写入数据,并且守护线程突然关闭,则该文件可能无法打开。
说实话,挺尴尬的。

建议尝试运行一些其他的实际脚本,比如使用守护线程运行一个无限循环,然后开一个非守护线程让它运行一下,看看差别有多大。

Python多线程与多线程中join()的用法

Python 多线程这个东西确实让人困惑。
之前在做项目的时候,也遇到过很多的坑。
让我告诉你我的经历。

那一年,我在上海,为一个电子商务网站做后台工作。
我需要同时处理多个用户的订单,所以我想使用多线程来使其更快。
刚开始使用的时候什么都不懂,就盲目的创建了主题。
结果呢?主线程已经执行完毕,但是子线程还在那里工作。
主线程直接退出,子线程也挂了。
系统变得不稳定,用户抱怨不断。

后来我了解到,默认行为是主线程忽略子线程,执行完毕后退出。
正如你所说,默认情况下,子线程在主线程完成后继续运行,直到它完成。
我当时的项目中,订单处理完了,但是日志没有完成,用户数据也丢失了,这让我真是苦不堪言。

所以后来,我学会了做人。
对于不重要且应该遵循主线程的任务,我使用 join() 方法。
记得有一次,我在做一个数据同步任务,必须等到所有子线程都同步完数据后,主线程才能继续运行。
如果不等,数据就会不完整,以后整个系统就会乱七八糟。
我使用 join() 强制主线程等待,直到所有子线程都完成执行,然后主线程才能继续。
这样就不会出错。

但是,有时你也需要让子线程自己运行,而不管主线程。
比如我之前做录音的时候,就使用了守护线程。
不过,注册表项是否完成并不重要。
执行完毕主线程就会退休,子线程也会退休。
我使用setDaemon(True),这样当主线程终止时,子线程会直接退出,而不影响主线程。
正如您所说,它适用于后台任务。

但是,应谨慎使用守护线程。
有一次,我做了一个文件下载任务并使用了守护线程。
结果文件还没下载完,主线程就退出了,子线程也退出了,文件下载就中断了。
后来才知道,守护线程是指当主线程退出时,无论情况如何,子线程都会直接跟随它。
因此,并非所有任务都适合守护线程。

总的来说,Python多线程如果使用得当可以提高效率,但是如果使用不当就会出现很大的问题。
关键是要明确区分哪些任务需要主线程等,哪些任务可以被主线程忽略。
另外,恶魔线应该谨慎使用。
我建议你多练习并熟悉它。

我麻了,京东一面:守护线程如何实现的?

所有用户线程都被终止,并且 JVM 被迫终止守护线程。

_number_of_non_daemon_threads 返回零时,JVM 退出。

守护线程无法管理文件和数据库等持久资源。

当创建守护线程时,默认会继承守护线程的属性。

小心使用守护线程以避免中断关键任务。

如何在Java中使用Thread.setDaemon设置守护线程

结论:Thread.setDaemon(true)应该在start()之前,以确保线程被设置为线程守护进程。
项目:在给定的后台监控服务中,我使用 Thread.setDaemon(true) 来确保后台线程在主线程完成时自动终止。

经验:如果不提前设置,JVM会抛出异常。
Number:在一个2 秒的监控任务中,我发现如果在start()之后调用setDaemon(true),就会抛出异常。

结论:守护线程无法完成长期操作。
时间:在一次 3 小时的文件备份任务中,我观察到将其设置为守护线程会导致备份在完成之前停止。

结论:子线程默认继承父线程的守护者属性。
项目:在数据库备份作业中,我创建的辅助线程自动成为守护线程。

结论:守护线程不适合资源密集型任务。
场景:在一次网络通信过程中,我使用守护线程发送数据,发现连接断开并没有关闭。

结论:当JVM退出时,守护线程可能还没有完成它的任务。
案例:在测试 JVM 退出时,我观察到守护线程的数据库操作被强制终止。

结论:通过shutdownhook确保资源清洁度。
操作:在 JVM 退出之前,我通过 Runtime.addShutdownHook 添加一个钩子,以确保数据库连接正确关闭。

自己掂量一下。