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

 

 

 

 

    

 

   

 
posted @ 2020-03-05 15:58  oraclemachine  阅读(139)  评论(0)    收藏  举报