浅谈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 相关文章推荐
11个并不被常用但对开发非常有帮助的Python库
Mar 31 Python
通过代码实例展示Python中列表生成式的用法
Mar 31 Python
Python实现简单的代理服务器
Jul 25 Python
Python复制Word内容并使用格式设字体与大小实例代码
Jan 22 Python
Python中整数的缓存机制讲解
Feb 16 Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 Python
python基于socket进行端口转发实现后门隐藏的示例
Jul 25 Python
解决Keras使用GPU资源耗尽的问题
Jun 22 Python
OpenCV图片漫画效果的实现示例
Aug 18 Python
python 生成器需注意的小问题
Sep 29 Python
Django视图类型总结
Feb 17 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
Mar 03 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动态生成虚拟现实VRML网页
2006/10/09 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
改版了网上的一个js操作userdata
2007/04/27 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
Javascript将数字转化成为货币格式字符串
2016/06/22 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
Angular.js实现动态加载组件详解
2017/05/28 Javascript
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
React从react-router路由上做登陆验证控制的方法
2018/05/10 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
javscript 数组扁平化的实现
2020/02/03 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
python入门之语句(if语句、while语句、for语句)
2015/01/19 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
python中子类调用父类函数的方法示例
2017/08/18 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
python3通过udp实现组播数据的发送和接收操作
2020/05/05 Python
Django xadmin安装及使用详解
2020/10/26 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
Python中读取文件名中的数字的实例详解
2020/12/25 Python
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
COACH德国官方网站:纽约现代奢侈品牌,1941年
2018/06/09 全球购物
旅游管理专业大学生职业规划书
2014/02/27 职场文书
校园公益广告语
2014/03/13 职场文书
防灾减灾活动总结
2014/08/30 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
中秋客户感谢信
2015/01/22 职场文书
邀请函模板
2015/02/02 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
2015年技术工作总结范文
2015/04/20 职场文书