浅谈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编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
Python 模板引擎的注入问题分析
Jan 01 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
Selenium定位元素操作示例
Aug 10 Python
用pycharm开发django项目示例代码
Oct 24 Python
windows下 兼容Python2和Python3的解决方法
Dec 05 Python
详解python的四种内置数据结构
Mar 19 Python
pytorch 实现tensor与numpy数组转换
Dec 27 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
May 03 Python
Python 操作 MySQL数据库
Sep 18 Python
通过实例解析Python文件操作实现步骤
Sep 21 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实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
2016/07/06 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
Vue实现选择城市功能
2017/05/27 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
2019/05/05 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
windows系统中python使用rar命令压缩多个文件夹示例
2014/05/06 Python
用Python解决x的n次方问题
2019/02/08 Python
使用Python发现隐藏的wifi
2020/03/04 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
奥利奥广告词
2014/03/20 职场文书
房产转让协议书
2014/04/11 职场文书
门面房租房协议书
2014/08/20 职场文书
租房安全协议书
2014/08/20 职场文书
个人工作能力自我评价
2015/03/05 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
学习商务礼仪心得体会
2016/01/22 职场文书
2016年小学教师政治学习心得体会
2016/01/23 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
浅析JavaScript中的变量提升
2022/06/01 Javascript