浅谈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 动态获取当前运行的类名和函数名的方法
Apr 15 Python
Python访问MySQL封装的常用类实例
Nov 11 Python
举例讲解Python程序与系统shell交互的方式
Apr 09 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
Jun 26 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
Jul 12 Python
Python面向对象之接口、抽象类与多态详解
Aug 27 Python
python和mysql交互操作实例详解【基于pymysql库】
Jun 04 Python
Python Pandas 如何shuffle(打乱)数据
Jul 30 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
通过python检测字符串的字母
Feb 18 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
python利用appium实现手机APP自动化的示例
Jan 26 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上传图片、删除图片实现代码
2010/05/12 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
php的debug相关函数用法示例
2016/07/11 PHP
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
简单实现JS对dom操作封装
2015/12/02 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
angularjs 中$apply,$digest,$watch详解
2016/10/13 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
NodeJS使用formidable实现文件上传
2016/10/27 NodeJs
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
vue离开当前页面触发的函数代码
2020/09/01 Javascript
Python 基础之字符串string详解及实例
2017/04/01 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
python os模块简单应用示例
2019/05/23 Python
django如何自己创建一个中间件
2019/07/24 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
美国学校用品、教室和教学商店:Discount School Supply
2018/04/04 全球购物
德国的各种媒体在线商店:Thalia.de(书籍、电子书、玩具等)
2020/10/08 全球购物
品学兼优的大学生自我评价
2013/09/20 职场文书
计算机专业推荐信范文
2013/11/20 职场文书
护士实习生自我鉴定范文
2013/12/10 职场文书
岳父生日宴会答谢词
2014/01/13 职场文书
大一学生的职业生涯规划书范文
2014/01/19 职场文书
《母鸡》教学反思
2014/02/25 职场文书
关于环保的活动方案
2014/08/25 职场文书
行政复议答复书
2015/07/01 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
个人工作总结怎么写?
2019/04/09 职场文书
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python