浅谈Python中threading join和setDaemon用法及区别说明


Posted in Python onMay 02, 2020

Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别。

1、join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法。

原型:join([timeout])

里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接着执行的。

例子:

import threading 
import time 
class MyThread(threading.Thread): 
  def __init__(self,id): 
    threading.Thread.__init__(self) 
    self.id = id 
  def run(self): 
    x = 0 
    time.sleep(10) 
    print self.id 
 
if __name__ == "__main__": 
  t1=MyThread(999) 
  t1.start() 
  for i in range(5): 
    print I

执行后的结果是:

0
1
2
3
4
999

机器上运行时,4和999之间,有明显的停顿。

解释:

线程t1 start后,主线程并没有等线程t1运行结束后再执行,而是先把5次循环打印执行完毕(打印到4),然后sleep(10)后,线程t1把传进去的999才打印出来。

现在,我们把join()方法加进去(其他代码不变),看看有什么不一样,例子:

import threading 
import time 
class MyThread(threading.Thread): 
  def __init__(self,id): 
    threading.Thread.__init__(self) 
    self.id = id 
  def run(self): 
    x = 0 
    time.sleep(10) 
    print self.id 
 
if __name__ == "__main__": 
  t1=MyThread(999) 
  t1.start() 
  t1.join() 
  for i in range(5): 
    print I

执行后的结果是:

999
0
1
2
3
4

机器上运行时,999之前,有明显的停顿。

解释:

线程t1 start后,主线程停在了join()方法处,等sleep(10)后,线程t1操作结束被join,接着,主线程继续循环打印。

2、setDaemon()方法。主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有个要特别注意的:必须在start() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。

例子:就是设置子线程随主线程的结束而结束:

import threading 
import time 
class MyThread(threading.Thread): 
  def __init__(self,id): 
    threading.Thread.__init__(self) 
  def run(self): 
    time.sleep(5) 
    print "This is " + self.getName() 
 
if __name__ == "__main__": 
  t1=MyThread(999) 
  t1.setDaemon(True) 
  t1.start() 
  print "I am the father thread."

执行后的结果是:

I am the father thread.

可以看出,子线程t1中的内容并未打出。

解释:t1.setDaemon(True)的操作,将父线程设置为了守护线程。根据setDaemon()方法的含义,父线程打印内容后便结束了,不管子线程是否执行完毕了。

程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。

如果子线程未完成,则主线程会等待子线程完成后再退出。

但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法了。

所以,join和setDaemon的区别如上述的例子,它们基本是相反的。

以上这篇浅谈Python中threading join和setDaemon用法及区别说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python常见文件操作的函数示例代码
Nov 15 Python
python实现的登录和操作开心网脚本分享
Jul 09 Python
python回调函数用法实例分析
May 09 Python
使用Python对IP进行转换的一些操作技巧小结
Nov 09 Python
python实现将excel文件转化成CSV格式
Mar 22 Python
pyshp创建shp点文件的方法
Dec 31 Python
pyqt5 QProgressBar清空进度条的实例
Jun 21 Python
python如何获取列表中每个元素的下标位置
Jul 01 Python
在ipython notebook中使用argparse方式
Apr 20 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
Jun 01 Python
python爬取音频下载的示例代码
Oct 19 Python
10个python爬虫入门实例(小结)
Nov 01 Python
判断Threading.start新线程是否执行完毕的实例
May 02 #Python
python中threading开启关闭线程操作
May 02 #Python
浅谈python3打包与拆包在函数的应用详解
May 02 #Python
构建高效的python requests长连接池详解
May 02 #Python
如何基于windows实现python定时爬虫
May 01 #Python
如何基于python实现不邻接植花
May 01 #Python
Python接口测试结果集实现封装比较
May 01 #Python
You might like
一个简单php扩展介绍与开发教程
2010/08/19 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
2014/10/17 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
JS中的phototype详解
2017/02/04 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
Vue 莹石摄像头直播视频实例代码
2018/08/31 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
Pandas探索之高性能函数eval和query解析
2017/10/28 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
python中将一个全部为int的list 转化为str的list方法
2018/04/09 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
2019/09/29 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
python os.listdir()乱码解决方案
2021/01/31 Python
修理厂厂长岗位职责
2014/01/30 职场文书
关爱老人标语
2014/06/21 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL
解决python3安装pandas出错的问题
2021/05/20 Python
各种货币符号快捷输入
2022/02/17 杂记
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL
css3 选择器
2022/05/11 HTML / CSS