python线程join方法原理解析


Posted in Python onFebruary 11, 2020

这篇文章主要介绍了python线程join方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

几个事实

1 python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样

2 如果创建线程,并且设置了daemon为true,即thread.setDaemon(True), 则主线程执行完毕后自动退出,不会等待子线程的执行结果。而且随着主线程退出,子线程也消亡。

3 join方法的作用是阻塞,等待子线程结束,join方法有一个参数是timeout,即如果主线程等待timeout,子线程还没有结束,则主线程强制结束子线程。

4 如果线程daemon属性为False, 则join里的timeout参数无效。主线程会一直等待子线程结束。

5 如果线程daemon属性为True, 则join里的timeout参数是有效的, 主线程会等待timeout时间后,结束子线程。此处有一个坑,即如果同时有N个子线程join(timeout),那么实际上主线程会等待的超时时间最长为 N * timeout, 因为每个子线程的超时开始时刻是上一个子线程超时结束的时刻。

测试代码

import threading,time

def func():
  print "start thread time: ",time.strftime('%H:%M:%S')
  time.sleep(3)
  print "stop thread time: ",time.strftime('%H:%M:%S')

thread_list = []
for i in range(3):
  t1 = threading.Thread(target=func)
  #t1.setDaemon(True)

  thread_list.append(t1)

for r in thread_list:
  r.start()

for t in thread_list:
  #t.join(1)
  t.join()
print "stop main thread"

###子线程如果设置了t.join(timeout),则根据timeout的不同,结果会不同,前提是设置了setDaemon(True),否则join的timeout是没效的

#设置了setDaemon(True),但是没设置t.join()的运行结果:
#start thread time: 17:25:29
#start thread time: 17:25:29
#start thread time: 17:25:29
#stop main thread

#加了t1.setDaemon(True),并且设置了超时时间t.join(1)的运行结果:
#start thread time: 17:12:24
#start thread time: 17:12:24
#start thread time: 17:12:24
#stop main thread

#没加t1.setDaemon(True),并且设置了超时时间t.join(1)的运行结果,不过因为setDaemon的参数不是True所以就算设置了超时时间也没用:
#start thread time: 17:13:28
#start thread time: 17:13:28
#start thread time: 17:13:28
#stop main thread
#stop thread time:  17:13:31
#stop thread time:  17:13:31
#stop thread time:  17:13:31

#没加t1.setDaemon(True),但是设置了t.join(),没有超时时间的阻塞的运行结果:
#start thread time: 17:16:12
#start thread time: 17:16:12
#start thread time: 17:16:12
#stop thread time:  17:16:15
#stop thread time:  17:16:15
#stop thread time:  17:16:15
#stop main thread 

#即没有设置setDaemon(True),也没有设置join()的运行结果:
#start thread time: 17:22:25
#start thread time: 17:22:25
#start thread time: 17:22:25
#stop main thread
#stop thread time:  17:22:28
#stop thread time:  17:22:28
#stop thread time:  17:22:28

总结:

如果想让子进程正常的运行结束(子进程中所有的内容都运行了),则如果设置join(timeout)的话,前提是设置setDaemon(True),且setDaemon的参数为True,且join(timeout)的超时时间必须大于子进程执行所需的时间,不然没等子进程运行结束就超时退出了或者直接设置join()不带超时时间,也不用设置setDaemon(True)了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python字符转换
Sep 06 Python
Python实现的简单算术游戏实例
May 26 Python
自己使用总结Python程序代码片段
Jun 02 Python
python在不同层级目录import模块的方法
Jan 31 Python
CentOS6.5设置Django开发环境
Oct 13 Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 Python
使用turtle绘制五角星、分形树
Oct 06 Python
Python Lambda函数使用总结详解
Dec 11 Python
PyTorch实现AlexNet示例
Jan 14 Python
解决django的template中如果无法引用MEDIA_URL问题
Apr 07 Python
Python中格式化字符串的四种实现
May 26 Python
Python使用pandas导入csv文件内容的示例代码
Dec 24 Python
使用Python求解带约束的最优化问题详解
Feb 11 #Python
python 非线性规划方式(scipy.optimize.minimize)
Feb 11 #Python
使用遗传算法求二元函数的最小值
Feb 11 #Python
Python for循环搭配else常见问题解决
Feb 11 #Python
Python获取二维数组的行列数的2种方法
Feb 11 #Python
使用Puppeteer爬取微信文章的实现
Feb 11 #Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 #Python
You might like
PHP中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
IE bug table元素的innerHTML
2010/01/11 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
nodejs教程之异步I/O
2014/11/21 NodeJs
轮播图组件js代码
2016/08/08 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
2016/08/21 Javascript
谈谈对JavaScript原生拖放的深入理解
2016/09/20 Javascript
JS经典正则表达式笔试题汇总
2016/12/15 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
VUE长按事件需求详解
2017/10/18 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
使用weixin-java-tools完成微信授权登录、微信支付的示例
2018/09/26 Javascript
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
在Django的上下文中设置变量的方法
2015/07/20 Python
python3实现逐字输出的方法
2019/01/23 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
2020/03/06 Python
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
如何查找网页漏洞
2016/06/22 面试题
英语专业学生个人求职信
2014/01/28 职场文书
教师求职自荐信
2014/03/09 职场文书
经管应届生求职信范文
2014/05/18 职场文书
群众路线个人自我剖析材料
2014/10/07 职场文书
2014年度考核工作总结
2014/12/24 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
党员学习型组织心得体会
2019/06/21 职场文书