thread_name.join()和thread_name.set.Daemon()的思考
我们假设主线程main中启动了子线程kid,现在探讨kid.join()与kid.setDaemon()的区别与联系.
1) 默认状态
main会一直执行,同时kid一直执行,二者并无瓜葛。main执行到最后一行代码,不退出,默默等待kid结束,之后程序退出.
2) kid.set.Daemon(False)
与0x1等价.
3) kid.set.Daemon(True)
重点在main,不管kid执行状况如何,只要main执行完毕,程序立即退出.
4) kid.join(timeout)
重点在kid。
4.1) 设置一个timeout等待时间,在时间范围内,main必须等着kid,只有在kid执行完毕后,才轮到kid.join(timeout)之后的代码执行;
4.2) 如未设置timeout,相当于timeout趋于∞;
4.3) 如超时kid并未执行完毕,则main继续执行join()后的代码,与此同时,kid继续执行.
5) 补充
5.1) kid.set.Daemon()要在kid.start()前,kid.join()要在kid.start()后.
5.2) 请读者思考,如果kid.set.Daemon(True)与kid.join()同时出现,会发生什么?
# main thread # code before kid = threading.Thread(target=function, args=(arg1, arg2,)) kid.setDaemon(True) kid.start() kid.join() # code after
浙公网安备 33010602011771号