浅谈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自动zip压缩目录的方法
Jun 28 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
python的paramiko模块实现远程控制和传输示例
Oct 13 Python
对python中Json与object转化的方法详解
Dec 31 Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 Python
关于sys.stdout和print的区别详解
Dec 05 Python
python 使用opencv 把视频分割成图片示例
Dec 12 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
Python迭代器Iterable判断方法解析
Mar 16 Python
实例讲解Python 迭代器与生成器
Jul 08 Python
区分python中的进程与线程
Aug 13 Python
python 获取谷歌浏览器保存的密码
Jan 06 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
咖啡常见的种类
2021/03/03 新手入门
教你如何使用php session
2013/10/28 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
JavaScript实现购物车基本功能
2017/07/21 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
javascript合并两个数组最简单的实现方法
2019/09/14 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
Vue基础配置讲解
2019/11/29 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
Python实现的爬取百度贴吧图片功能完整示例
2019/05/10 Python
python print出共轭复数的方法详解
2019/06/25 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
AC Lens:购买隐形眼镜
2017/02/26 全球购物
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
2015年教师学期工作总结
2015/04/30 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js