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中的字典遍历备忘
Jan 17 Python
详解Python的Django框架中的模版继承
Jul 16 Python
Python实现自动为照片添加日期并分类的方法
Sep 30 Python
python购物车程序简单代码
Apr 18 Python
pygame游戏之旅 python和pygame安装教程
Nov 20 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
Oct 28 Python
Python3如何在Windows和Linux上打包
Feb 25 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
python中wx模块的具体使用方法
May 15 Python
Python OpenCV实现测量图片物体宽度
May 27 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
Feb 02 Python
如何利用python实现Simhash算法
Jun 28 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
实用函数3
2007/11/08 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
JQuery中clone方法复制节点
2015/05/18 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
2015/07/29 Javascript
AngularJS 实现按需异步加载实例代码
2015/10/18 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
js 实现在2d平面上画8的方法
2018/10/10 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
JS highcharts动态柱状图原理及实现
2020/10/16 Javascript
python2.7删除文件夹和删除文件代码实例
2013/12/18 Python
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
使用python实现ANN
2017/12/20 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
浅谈tensorflow 中tf.concat()的使用
2020/02/07 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
为世界各地的女性设计和生产时尚服装:ROMWE
2016/09/17 全球购物
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
完美主义个人的自我评价
2014/02/17 职场文书
2014年化验室工作总结
2014/11/21 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android