浅谈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 相关文章推荐
在Django的URLconf中使用命名组的方法
Jul 18 Python
python开发中range()函数用法实例分析
Nov 12 Python
Python下载指定页面上图片的方法
May 12 Python
python 简单的绘图工具turtle使用详解
Jun 21 Python
ubuntu17.4下为python和python3装上pip的方法
Jun 12 Python
python requests爬取高德地图数据的实例
Nov 10 Python
pandas数据集的端到端处理
Feb 18 Python
用python写一个定时提醒程序的实现代码
Jul 22 Python
python 字符串常用方法汇总详解
Sep 16 Python
基于python和flask实现http接口过程解析
Jun 15 Python
python 5个实用的技巧
Sep 27 Python
pandas提升计算效率的一些方法汇总
May 30 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生成带有雪花背景的验证码
2006/10/09 PHP
php注销代码(session注销)
2012/05/31 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
浅谈PHP中output_buffering
2015/07/13 PHP
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
jquery默认校验规则整理
2014/03/24 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
2015/04/16 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
Vue的Class与Style绑定的方法
2017/09/01 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
微信小程序的mpvue框架快速上手指南
2019/05/15 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
2019/05/21 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
js实现简单的秒表
2020/01/16 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
同时安装Python2 & Python3 cmd下版本自由选择的方法
2017/12/09 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
python格式化输出保留2位小数的实现方法
2019/07/02 Python
python matplotlib库直方图绘制详解
2019/08/10 Python
美国珠宝网上商店:Jeulia
2016/09/01 全球购物
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
你对IPv6了解程度
2016/02/09 面试题
基于Python 函数和方法的区别说明
2021/03/24 Python
应届护士求职信范文
2014/01/26 职场文书
《狐假虎威》教学反思
2014/02/07 职场文书
党员群众路线剖析材料
2014/10/08 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
道歉短信大全
2015/05/12 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书
护士心得体会范文
2016/01/25 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL