浅谈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处理PHP数组文本文件实例
Sep 18 Python
详解python的ORM中Pony用法
Feb 09 Python
使用Python设计一个代码统计工具
Apr 04 Python
Django 使用Ajax进行前后台交互的示例讲解
May 28 Python
详解Django将秒转换为xx天xx时xx分
Sep 27 Python
python安装本地whl的实例步骤
Oct 12 Python
用什么库写 Python 命令行程序(示例代码详解)
Feb 20 Python
pyecharts在数据可视化中的应用详解
Jun 08 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
python drf各类组件的用法和作用
Jan 12 Python
python基础学习之生成器与文件系统知识总结
May 25 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 25 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的ASCII码转换类
2013/07/05 PHP
php验证码的制作思路和实现方法
2015/11/12 PHP
thinkPHP框架自动填充原理与用法分析
2018/04/03 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
jQuery Deferred和Promise创建响应式应用程序详细介绍
2013/03/05 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
jquery之基本选择器practice(实例讲解)
2017/09/30 jQuery
JS实现简易留言板特效
2019/12/23 Javascript
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
简单介绍python封装的基本知识
2019/08/10 Python
pytorch 批次遍历数据集打印数据的例子
2019/12/30 Python
公司营业员的工作总结自我评价
2013/10/05 职场文书
电子商务专业学生的学习自我评价
2013/10/27 职场文书
企业内部培训方案
2014/02/04 职场文书
物流专员岗位职责
2014/02/17 职场文书
2015年毕业生自我鉴定模板
2014/09/19 职场文书
2015关爱留守儿童工作总结
2014/12/12 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
2015年高考寄语或鼓励的话
2015/03/23 职场文书
首次购房证明
2015/06/19 职场文书
小学生红领巾广播稿
2015/08/19 职场文书
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS