2019/12/19 02-join和daemon线程的总结

在这里插入图片描述
当daemon等于false的时候会发现,主线程会等,daemon=true,主线程久不关心,如果daemon不给值就是none,会取当前线程的daemon值,当前线程就是创建这个线程的线程,也就是父线程

在这里插入图片描述
结论,一般是这个程序结束,就是主线程需要退出,但是因为有none-daemon线程,主线程退出的时候,进程可以知道哪些还是活动的线程,如果除了主线程意外,这些活着的子线程,没有none-daemon线程了,主线程就可以退出,退出之前把其他所有线程kill掉,主线程一旦结束,整个进程结束,主线程正常结束,状态码返回是0 ,如果不是正常结束,返回就是非0,如果是其他的工作线程意外退出,实际上不会改变整个进程返回的状态,工作线程崩溃,主线程照样正常结束,所以进程的返回是要看主线程如何返回的

总之主线程退出就要看是否还有none-daemon线程

能否让daemon线程也等待一下,这时候提高了join方法,本来t1是daemon线程,执行5秒,但是2秒的none-daemon程序就结束了,就无法执行了,现在使用join方法
foo执行完了,bar执行了一半就结束了,
在这里插入图片描述
2秒打印foo,5秒打印bar,最后打印main thread exists,用了join ,执行顺序发生了一些变化
在这里插入图片描述
join导致主线程,一直在等bar,已经阻塞住了,主线程被迫等待t1完成,主线程调用了t1的join方法,就必须等t1执行完才能继续执行,处在阻塞状态在这里插入图片描述
join的方法是,在哪一个线程调用了另一个线程的,比如A线程调用B线程的join方法,A线程被迫阻塞等待B线程执行完成之后,阻塞才会取消,
t1.join会导致当前这个线程,要等待join t1,直到t1完成为止,有了join,daemon好像没什么用处
在这里插入图片描述
如果没有join,这两个daemon程序会直接关掉在这里插入图片描述
看不到bar和work的原因,因为创建这俩个线程是daemon,不是none-daemon,主线程不会等在这里插入图片描述
这里写join会导致主线程卡在这里,主线程执行不完,就不会关系你是daemon还是none-daemon,主线程执行完了才会关心你是daemon还是none-daemon在这里插入图片描述
把join放在这里是不会有效果的,主线程没有阻塞,就会关闭daemon线程在这里插入图片描述
下面主线程卡住了在等t1完成,打印bar之后,是否会打印睡眠10秒的work在这里插入图片描述
不会因为bar里面创建一个新的线程出来,主线程就不退出了,pirnt(bar),t1.join这个线程就不会在阻塞了,主线程等待1秒,就继续向下执行
在这里插入图片描述
这里虽然bar创建里面的线程,只是创建一下,但不归t1管理,不会因为t1消亡而消亡在这里插入图片描述
主线程等t1,t1在等待t,等待10秒,把work打印了,等待5秒,打印bar, 15秒+1秒,主线程打印退出在这里插入图片描述
多线程,join用的比较多,尤其python2,A线程调用B的join,A线程就要等B线程结束,join是一定要等结束的,但是只要阻塞的不是主线程,主线程完成,就会退出,会看当前是否有none-daemon,没有none-daemon再退出

也有些人偷懒,会把t1,t2,t3全部join,都会等待,主线程最后才结束,有的人写多线程,为了让主线程等待其他线程,都写join,坏处就是主线程卡住,什么事情都做不了在这里插入图片描述在这里插入图片描述在这里插入图片描述
join默认是timeout=none,是永久等待,一直阻塞住
t1.join。谁调用t1.join,谁就等待t1

在这里插入图片描述
t1.join。谁调用t1.join,谁就等待t1在这里插入图片描述

daemon线程应用场景

在这里插入图片描述
如果全部都是daemon线程,主线程退出的时候,还有一个none-daemon,那就还得等,如果全是daemon,就全部干掉。daemon就随着主线程退出而退出

主要应用场景:
1.后台任务,如发生心跳包,监控,这种场景最多。(关掉服务,顺便把心跳包的线程也关掉,就特别适合哟个daemon线程,主线程关了,他们就一起关掉)
2、主线程工作才有用的线程。如主线程中维护这公共的资源,主线程已经清理了, 准备退出,而工作线程使用这些资源工作也没有意义了,-起退出最合适。
3.随时可以被终止的线程

在这里插入图片描述
这个daemon线程一旦创建,就可以不关心什么时候退出了,主线程退出会自动关闭在这里插入图片描述
如果一个none——daemon线程A中,对另一个daemon线程B使用了join方法,这个线程B设置成daemon就没有什么意义了,因为none-daemon线程A总是要等待B。
如果一个daemon线程C中,对另一个daemon线程D使用了join方法,只能说明C要等待D,主线程退出,C和D不管是否结束,也不管它们谁等谁,都要被杀掉。
在这里插入图片描述在这里插入图片描述在这里插入图片描述
都是daemon的,主线程根本就不等,3秒之后都kill掉在这里插入图片描述
加上一个t1.join在这里插入图片描述加上一个t1.join,假设没有t2.join,t1.join,很快执行完,bar是个daemon,主线程就不等,就干掉在这里插入图片描述
t2.join,就是死循环,主线程等t1,t1等t2,t2是死循环,主线程就永远退出不了在这里插入图片描述
主线程要退出,其他也退出,就可以用daemon,不太建议join,因为主线程会阻塞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值