浅谈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定时器使用示例分享
Feb 16 Python
Python三种遍历文件目录的方法实例代码
Jan 19 Python
python截取两个单词之间的内容方法
Dec 25 Python
PyQt5 QTable插入图片并动态更新的实例
Jun 18 Python
python os.fork() 循环输出方法
Aug 08 Python
Python读取表格类型文件代码实例
Feb 17 Python
Python抓包程序mitmproxy安装和使用过程图解
Mar 02 Python
django模板获取list中指定索引的值方式
May 14 Python
浅谈keras保存模型中的save()和save_weights()区别
May 21 Python
安装并免费使用Pycharm专业版(学生/教师)
Sep 24 Python
详解Anaconda安装tensorflow报错问题解决方法
Nov 01 Python
Python数据清洗工具之Numpy的基本操作
Apr 22 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分页示例代码
2007/03/19 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
PHP基于cookie实现统计在线人数功能示例
2019/01/16 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
DOM 中的事件处理介绍
2012/01/18 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
Bootstrap实现的标签页内容切换显示效果示例
2017/05/25 Javascript
javascript 封装Date日期类实例详解
2017/05/28 Javascript
JS中type="button"和type="submit"的区别
2017/07/04 Javascript
关于react-router的几种配置方式详解
2017/07/24 Javascript
JavaScript比较同一天的时间大小实例代码
2018/02/09 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
Python中SOAP项目的介绍及其在web开发中的应用
2015/04/14 Python
Python3读取zip文件信息的方法
2015/05/22 Python
Python使用bs4获取58同城城市分类的方法
2015/07/08 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
Python 打印中文字符的三种方法
2018/08/14 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
Python库安装速度过慢解决方案
2020/07/14 Python
HTML5中如何显示视频呢 HTML5视频播放demo
2013/06/08 HTML / CSS
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
澳大利亚便宜隐形眼镜购买网站:QUICKLENS Australia
2018/10/06 全球购物
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
入学生会自荐书范文
2014/02/05 职场文书
怎样写好自我评价呢?
2014/02/16 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
教师求职简历自我评价
2015/03/10 职场文书
警示教育片观后感
2015/06/17 职场文书