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用字典统计单词或汉字词个数示例
Apr 22 Python
python中遍历文件的3个方法
Sep 02 Python
Python中的两个内置模块介绍
Apr 05 Python
解决pandas 作图无法显示中文的问题
May 24 Python
TensorFlow实现Logistic回归
Sep 07 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
Oct 14 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
浅谈python requests 的put, post 请求参数的问题
Jan 02 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
Jun 18 Python
django ModelForm修改显示缩略图 imagefield类型的实例
Jul 28 Python
Python中Unittest框架的具体使用
Aug 27 Python
Python如何爬取qq音乐歌词到本地
Jun 01 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操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
JS查看对象功能代码
2008/04/25 Javascript
prototype 中文参数乱码解决方案
2009/11/09 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
Javascript页面添加到收藏夹的简单方法
2013/08/07 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
JS代码实现电脑配置检测功能
2018/03/21 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
详解javascript对数组和json数组的操作
2019/04/15 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
vue实现购物车的监听
2020/04/20 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
vue实现列表拖拽排序的功能
2020/11/02 Javascript
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
Python处理json字符串转化为字典的简单实现
2016/07/07 Python
Python简单实现socket信息发送与监听功能示例
2018/01/03 Python
利用python如何处理nc数据详解
2018/05/23 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
Python json读写方式和字典相互转化
2020/04/18 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
房屋改造计划书
2014/01/10 职场文书
实习报告评语
2014/04/26 职场文书
先进党支部事迹材料
2014/12/24 职场文书
法定代表人身份证明书
2015/06/18 职场文书
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS
Redis命令处理过程源码解析
2022/02/12 Redis