浅谈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数组的处理代码
Jan 04 Python
跟老齐学Python之私有函数和专有方法
Oct 24 Python
python中实现指定时间调用函数示例代码
Sep 08 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
Oct 15 Python
Python向excel中写入数据的方法
May 05 Python
Flask框架钩子函数功能与用法分析
Aug 02 Python
Python API自动化框架总结
Nov 12 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
Python Sympy计算梯度、散度和旋度的实例
Dec 06 Python
tensorflow使用range_input_producer多线程读取数据实例
Jan 20 Python
Python Switch Case三种实现方法代码实例
Jun 18 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
人族 Terran 基本策略
2020/03/14 星际争霸
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
php学习笔记 数组的常用函数
2011/06/13 PHP
数据库中排序的对比及使用条件详解
2012/02/23 PHP
php连接mssql数据库的几种方法
2013/02/21 PHP
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
js/html光标定位的实现代码
2013/09/23 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
2016/06/07 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python正则中最短匹配实现代码
2018/01/16 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
Python如何实现FTP功能
2020/05/28 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
CSS3中Animation动画属性用法详解
2016/07/04 HTML / CSS
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
大学生入党自我鉴定
2013/10/31 职场文书
总经理助理的八要求
2013/11/12 职场文书
优秀广告词大全
2014/03/19 职场文书
电子装配专业毕业生求职信
2014/04/23 职场文书
护士实习求职信
2014/06/22 职场文书
详解Python类和对象内容
2021/06/22 Python