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 Tkinter简单布局实例教程
Sep 03 Python
Python入门篇之对象类型
Oct 17 Python
对Python中内置异常层次结构详解
Oct 18 Python
对python中GUI,Label和Button的实例详解
Jun 27 Python
用Python徒手撸一个股票回测框架搭建【推荐】
Aug 05 Python
使用apiDoc实现python接口文档编写
Nov 19 Python
django 中使用DateTime常用的时间查询方式
Dec 03 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
Feb 27 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
Python中常见的数制转换有哪些
May 27 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
python数据处理之Pandas类型转换
Apr 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
php数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
jQuery 位置插件
2008/12/25 Javascript
javascript 必知必会之closure
2009/09/21 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
JS函数修改html的元素内容,及修改属性内容的方法
2016/10/28 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
Python简明入门教程
2015/08/04 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
Python time库基本使用方法分析
2019/12/13 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
多视角3D可旋转的HTML5 Logo动画
2016/03/02 HTML / CSS
HTML5拖拽API经典实例详解
2018/04/20 HTML / CSS
Html5自定义字体解决方法
2019/10/09 HTML / CSS
优衣库英国官网:UNIQLO英国
2016/12/25 全球购物
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
结构工程个人自荐信范文
2013/11/30 职场文书
给客户的道歉信
2014/01/13 职场文书
先进德育工作者事迹材料
2014/01/24 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
2014年团总支工作总结
2014/11/21 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
2015年教育实习工作总结
2015/04/24 职场文书
Go Plugins插件的实现方式
2021/08/07 Golang
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python