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中MYSQLdb出现乱码的解决方法
Oct 11 Python
详解Python3操作Mongodb简明易懂教程
May 25 Python
通过Python实现自动填写调查问卷
Sep 06 Python
python中文件变化监控示例(watchdog)
Oct 16 Python
Python使用Turtle模块绘制五星红旗代码示例
Dec 11 Python
Python实现的端口扫描功能示例
Apr 08 Python
python的debug实用工具 pdb详解
Jul 12 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
Aug 06 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
Python动态强类型解释型语言原理解析
Mar 25 Python
python实现ROA算子边缘检测算法
Apr 05 Python
python利用while求100内的整数和方式
Nov 07 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/24 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
PHP面向对象之工作单元(实例讲解)
2017/06/26 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
js表单登陆验证示例
2016/10/19 Javascript
JavaScript中数组常见操作技巧
2017/09/01 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
Python发送Email方法实例
2014/08/21 Python
python3新特性函数注释Function Annotations用法分析
2016/07/28 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
高中三年学习生活的自我评价
2013/10/10 职场文书
音乐专业应届生教师求职信
2013/11/04 职场文书
群众路线剖析材料
2014/02/02 职场文书
小学数学国培感言
2014/03/10 职场文书
小学庆六一活动总结
2014/08/28 职场文书
新党章的学习心得体会
2014/11/07 职场文书
提档介绍信范文
2015/10/22 职场文书
小学班主任培训心得体会
2016/01/07 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
全网非常详细的pytest配置文件
2022/07/15 Python