使用守护线程监控线程的存活_python笔记6-多线程Threading之阻塞和守护线程

本文通过火锅就餐场景介绍了Python中主线程与子线程的关系,阐述了守护线程setDaemon()和阻塞主线程join(timeout)的概念。在默认情况下,主线程结束后子线程会继续执行;设置守护线程则会随主线程一同结束;join()方法可使主线程等待子线程执行完毕后再退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言丨

今天请zhang和yang吃火锅,吃完火锅的时候会有以下三种场景:

场景一:小虫子(主)先吃完了,zhang(客)和yang(客)还没吃完,这种场景会导致结账的人先走了,剩下两位客人。

场景二:小虫子(主)先吃完了,zhang和yang还没吃饱,一起结账走人。

场景三:小虫子(主)先等zhang和yang吃饱了,最后结账一起走人。

首先需要明确几个概念:

知识点一:

当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束。(对应场景一)

知识点二:

当我们使用setDaemon(True)方法,设置子线程为守护线程时,主线程一旦执行结束,则全部线程全部被终止执行,可能出现的情况就是,子线程的任务还没有完全执行结束,就被迫停止。(对应场景二)

知识点三:

此时join的作用就凸显出来了,**join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程在终止。(对应场景三)


主线程与子线程

场景一:主线程已经结束了,子线程还在跑

1.我们把thread1.start()和thread2.start()称为两个子线程,写在外面的代码就是主线程了。

39d7e1ab65c5165d55d2194af0006c34.png

2.运行结果:

6da281ecdc187562fcad07e1d42b4a3e.png

守护线程setDaemon()

场景二:主线程结束了,子线程必须也跟着结束

1.主线程中,创建了子线程thread1和thread2,并且在主线程中调用了thread.setDaemon(),这个的意思是把主线程设置为守护线程,这时候要是主线程执行结束了,就不管子线程是否完成,一并和主线程退出。(敲黑板:必须在start()方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。)

2.线程有一个布尔属性叫做daemon,表示线程是否是守护线程,默认取否。当程序中的线程全部是守护线程时,程序才会退出,只要还存在一个非守护线程,程序就不会退出。

主线程是非守护线程。

3.setDaemon(True)此方法里面参数设置为True才会生效

d0ff5758fa90900e8cad4d6f7abbb8c6.png

4.运行结果:

1ee09ef5ee76827079503f07f44966b1.png

阻塞主线程join(timeout)

1.如果想让主线程等待子线程结束后再运行的话,就需要用到join(),此方法是在start之后(与setDaemon相反)

2.join(timeout)此方法有个timeout参数,是线程超时时间设置。

853949db645dca824ffeb2641b822e84.png

运行结果:

b82dc59cf62a52e5a9ead22370cefc31.png


参考代码:

f18a77680fafa0d8eed2b6b41acc6519.png

以上是python笔记6的全部内容,如果觉得对你有帮助,就点击“收藏”吧!

如果还有疑问的地方,欢迎评论留言给我们~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值