浅谈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中的__future__模块
Apr 27 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
windows下python安装pip图文教程
May 25 Python
使用pandas对两个dataframe进行join的实例
Jun 08 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 Python
python随机数分布random测试
Aug 27 Python
python如何生成各种随机分布图
Aug 27 Python
Python3 chardet模块查看编码格式的例子
Aug 14 Python
python多任务之协程的使用详解
Aug 26 Python
python 字典的打印实现
Sep 26 Python
pyCharm 实现关闭代码检查
Jun 09 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 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中用正则表达式清除字符串的空白
2011/01/17 PHP
PHP与C#分别格式化文件大小的代码
2011/05/14 PHP
php程序内部post数据的方法
2015/03/31 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
学习PHP session的传递方式
2016/06/15 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
JavaScript基础重点(必看)
2016/07/09 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
vue中的数据绑定原理的实现
2018/07/02 Javascript
使用vue-router切换页面时,获取上一页url以及当前页面url的方法
2019/05/06 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
pyside写ui界面入门示例
2014/01/22 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
python常用数据重复项处理方法
2019/11/22 Python
解决Python中回文数和质数的问题
2019/11/24 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
一些PHP的面试题
2015/05/06 面试题
大课间活动实施方案
2014/03/06 职场文书
2014年党员公开承诺书范文
2014/03/28 职场文书
负责人任命书范本
2014/06/04 职场文书
求职信的正确写法
2014/07/10 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
红十字会救护培训简讯
2015/07/20 职场文书