浅谈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 14 Python
Python解决八皇后问题示例
Apr 22 Python
对python 自定义协议的方法详解
Feb 13 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
python SQLAlchemy 中的Engine详解
Jul 04 Python
python实现windows倒计时锁屏功能
Jul 30 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
Aug 22 Python
Python如何用filter函数筛选数据
Mar 05 Python
django 连接数据库出现1045错误的解决方式
May 14 Python
Python通过format函数格式化显示值
Oct 17 Python
详解Django中异步任务之django-celery
Nov 05 Python
python pyg2plot的原理知识点总结
Feb 28 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
URL Rewrite的设置方法
2007/01/02 PHP
在数据量大(超过10万)的情况下
2007/01/15 PHP
php xml文件操作实现代码(二)
2009/03/20 PHP
php 中文字符入库或显示乱码问题的解决方法
2010/04/12 PHP
php网站地图生成类示例
2014/01/13 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
详解基于node的前端项目编译时内存溢出问题
2017/08/01 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
[36:19]2018DOTA2亚洲邀请赛 小组赛 A组加赛 Newbee vs LGD
2018/04/03 DOTA
Python enumerate遍历数组示例应用
2008/09/06 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
Python grpc超时机制代码示例
2020/09/14 Python
关于Java finally的面试题
2016/04/27 面试题
学校食堂采购员岗位职责
2013/12/05 职场文书
六一儿童节活动策划方案
2014/01/27 职场文书
大三学习计划书范文
2014/05/02 职场文书
2014教师研修学习体会
2014/07/08 职场文书
交通安全教育心得体会
2016/01/15 职场文书
Python time库的时间时钟处理
2021/05/02 Python
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
2021/11/11 Python
分享Python获取本机IP地址的几种方法
2022/03/17 Python
在Python 中将类对象序列化为JSON
2022/04/06 Python
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技