浅谈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实现将元祖转换成数组的方法
May 04 Python
python将ansible配置转为json格式实例代码
May 15 Python
Python中的浮点数原理与运算分析
Oct 12 Python
基于Python中capitalize()与title()的区别详解
Dec 09 Python
Python爬虫实现百度图片自动下载
Feb 04 Python
5分钟 Pipenv 上手指南
Dec 20 Python
python实现按行分割文件
Jul 22 Python
python 提取文件指定列的方法示例
Aug 07 Python
pytorch 共享参数的示例
Aug 17 Python
python 进程的几种创建方式详解
Aug 29 Python
Python 图像对比度增强的几种方法(小结)
Sep 25 Python
使用numpy nonzero 找出非0元素
May 14 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
4种PHP异步执行的常用方式
2015/12/24 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
详解JavaScript中的表单验证
2015/06/16 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
AngularJs 终极购物车(实例讲解)
2017/11/08 Javascript
thinkjs 文件上传功能实例代码
2017/11/08 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
JavaScript 获取滚动条位置并将页面滑动到锚点
2021/02/08 Javascript
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
[36:19]2018DOTA2亚洲邀请赛 小组赛 A组加赛 Newbee vs LGD
2018/04/03 DOTA
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
python 文件查找及内容匹配方法
2018/10/25 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
Python读写Excel表格的方法
2021/03/02 Python
CSS3中动画属性transform、transition和animation属性的区别
2016/09/25 HTML / CSS
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
什么是Smart Navigation?
2016/07/03 面试题
一月红领巾广播稿
2014/02/11 职场文书
聘用意向书范本
2014/04/01 职场文书
2014年党务工作总结
2014/11/25 职场文书
计划生育汇报材料
2014/12/26 职场文书
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
MySQL transaction事务安全示例讲解
2022/06/21 MySQL