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编程中的for循环语句学习教程
Oct 14 Python
Python使用SocketServer模块编写基本服务器程序的教程
Jul 12 Python
用Python进行简单图像识别(验证码)
Jan 19 Python
详解pyqt5 动画在QThread线程中无法运行问题
May 05 Python
Python3使用SMTP发送带附件邮件
Jun 16 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
Oct 21 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
Jul 23 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
Aug 13 Python
python 实现一个图形界面的汇率计算器
Nov 09 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
Python 循环读取数据内存不足的解决方案
May 25 Python
python和anaconda的区别
May 06 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
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
PHP 编程的 5个良好习惯
2009/02/20 PHP
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
php处理文件的小例子(解压缩,删除目录)
2013/02/03 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
Bootstrap 附加导航(Affix)插件实例详解
2016/06/01 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
Bootstrap Table使用心得总结
2016/11/29 Javascript
JavaScript简单生成 N~M 之间随机数的方法
2017/01/13 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
python解析xml模块封装代码
2014/02/07 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
一个Python最简单的接口自动化框架
2018/01/02 Python
python实现自动解数独小程序
2019/01/21 Python
python反转列表的三种方式解析
2019/11/08 Python
Python FFT合成波形的实例
2019/12/04 Python
解决python 找不到module的问题
2020/02/12 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
车辆安全隐患排查制度
2015/08/05 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
《司马光》教学反思
2016/02/22 职场文书