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使用Flask框架获取当前查询参数的方法
Mar 21 Python
回调函数的意义以及python实现实例
Jun 20 Python
Python自动化运维_文件内容差异对比分析
Dec 13 Python
Python使用zip合并相邻列表项的方法示例
Mar 17 Python
在Python中使用gRPC的方法示例
Aug 08 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 Python
Flask之pipenv虚拟环境的实现
Nov 26 Python
python 实现一个反向单位矩阵示例
Nov 29 Python
python 实现目录复制的三种小结
Dec 04 Python
Python使用Matlab命令过程解析
Jun 04 Python
Python正则re模块使用步骤及原理解析
Aug 18 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
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
thinkPHP基于ajax实现的菜单与分页示例
2016/07/12 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
Vue.js中extend选项和delimiters选项的比较
2017/07/17 Javascript
Element input树型下拉框的实现代码
2018/12/21 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
windows系统中python使用rar命令压缩多个文件夹示例
2014/05/06 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
鼓励运动员的广播稿
2014/02/08 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
10的分与合教学反思
2014/04/30 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
某药房的新员工入职告知书!
2019/07/15 职场文书
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL