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 绘图和可视化详细介绍
Feb 11 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 Python
python实现最长公共子序列
May 22 Python
python 用正则表达式筛选文本信息的实例
Jun 05 Python
在PyCharm中批量查找及替换的方法
Jan 20 Python
使用python list 查找所有匹配元素的位置实例
Jun 11 Python
Python collections中的双向队列deque简单介绍详解
Nov 04 Python
Python数据可视化:幂律分布实例详解
Dec 07 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
python字典的值可以修改吗
Jun 29 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 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 session实现多级目录存放实现代码
2016/02/03 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
2020/08/24 PHP
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
node.js中的http.request.end方法使用说明
2014/12/10 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
javascript每日必学之封装
2016/02/23 Javascript
js的form表单提交url传参数(包含+等特殊字符)的两种解决方法
2016/05/25 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
Python循环语句之break与continue的用法
2015/10/14 Python
python中redis的安装和使用
2016/12/04 Python
python列表推导式入门学习解析
2019/12/02 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
基于Python正确读取资源文件
2020/09/14 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
基于Python爬取素材网站音频文件
2020/10/21 Python
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
旅游管理毕业生自荐信
2013/11/05 职场文书
毕业自我鉴定范文
2013/11/06 职场文书
大学运动会通讯稿
2014/01/28 职场文书
cf收人广告词大全
2014/03/14 职场文书
文明单位申报材料
2014/12/23 职场文书
旷课检讨书范文
2015/01/27 职场文书
导游词之宿迁乾隆行宫
2019/10/15 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
手把手教你怎么用Python实现zip文件密码的破解
2021/05/27 Python