浅谈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 相关文章推荐
pyv8学习python和javascript变量进行交互
Dec 04 Python
sublime python3 输入换行不结束的方法
Apr 19 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
Python使用pyshp库读取shapefile信息的方法
Dec 29 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
python版百度语音识别功能
Jul 09 Python
django之自定义软删除Model的方法
Aug 14 Python
python3文件复制、延迟文件复制任务的实现方法
Sep 02 Python
读取nii或nii.gz文件中的信息即输出图像操作
Jul 01 Python
python实现控制台输出颜色
Mar 02 Python
python Protobuf定义消息类型知识点讲解
Mar 02 Python
详解分布式系统中如何用python实现Paxos
May 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
Array of country list in PHP with Zend Framework
2011/10/17 PHP
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
Jquery ui css framework
2010/06/28 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
深入理解Vue 单向数据流的原理
2017/11/09 Javascript
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
python字符串查找函数的用法详解
2019/07/08 Python
django 连接数据库 sqlite的例子
2019/08/14 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
Python中url标签使用知识点总结
2020/01/16 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
Python分类测试代码实例汇总
2020/07/23 Python
CSS3中Transform动画属性用法详解
2016/07/04 HTML / CSS
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
给客户的道歉信
2014/01/13 职场文书
学校岗位设置方案
2014/01/16 职场文书
党员2014两会学习心得体会
2014/03/17 职场文书
《观舞记》教学反思
2014/04/16 职场文书
单位作风建设自查报告
2014/10/23 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书
学习心得体会
2019/06/20 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android
详解SQL的窗口函数
2022/04/21 Oracle