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 相关文章推荐
使用PDB模式调试Python程序介绍
Apr 05 Python
Python中isnumeric()方法的使用简介
May 19 Python
详解Python编程中基本的数学计算使用
Feb 04 Python
深入浅析python 中的匿名函数
May 21 Python
Python使用pymongo模块操作MongoDB的方法示例
Jul 20 Python
Tornado Web Server框架编写简易Python服务器
Jul 28 Python
Python后台管理员管理前台会员信息的讲解
Jan 28 Python
python opencv实现信用卡的数字识别
Jan 12 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
Jul 13 Python
pandas处理csv文件的方法步骤
Oct 16 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
Python+Appium实现自动化清理微信僵尸好友的方法
Feb 04 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 字符串分割和比较
2009/10/06 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
php过滤XSS攻击的函数
2013/11/12 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
js添加table的行和列 具体实现方法
2013/07/22 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
简单理解vue中el、template、replace元素
2016/10/27 Javascript
Vue关于数据绑定出错解决办法
2017/05/15 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
2017/11/13 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
详解javascript void(0)
2020/07/13 Javascript
[05:00]第二届DOTA2亚洲邀请赛主赛事第三天比赛集锦.mp4
2017/04/04 DOTA
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
用python实现批量重命名文件的代码
2012/05/25 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
python列表的增删改查实例代码
2018/01/30 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
css3学习心得分享
2013/08/19 HTML / CSS
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
中学生纪念九一八事变演讲稿
2014/09/14 职场文书
2014单位领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
专题组织生活会发言材料
2014/10/17 职场文书
同学会邀请函模板
2015/01/30 职场文书
孔庙导游词
2015/02/04 职场文书
学生会辞职信
2015/03/02 职场文书
天那边观后感
2015/06/09 职场文书
工资证明格式模板
2015/06/12 职场文书