Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别。

1、join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法。

原型:join([timeout])

里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接着执行的。

例子:

[python] view plain copy
  1. import threading
  2. import time
  3. class MyThread(threading.Thread):
  4. def __init__(self,id):
  5. threading.Thread.__init__(self)
  6. self.id = id
  7. def run(self):
  8. x = 0
  9. time.sleep(10)
  10. print self.id
  11. if __name__ == "__main__":
  12. t1=MyThread(999)
  13. t1.start()
  14. for i in range(5):
  15. print i

执行后的结果是:

[python] view plain copy
  1. 0
  2. 1
  3. 2
  4. 3
  5. 4
  6. 999

机器上运行时,4和999之间,有明显的停顿。解释:线程t1 start后,主线程并没有等线程t1运行结束后再执行,而是先把5次循环打印执行完毕(打印到4),然后sleep(10)后,线程t1把传进去的999才打印出来。

现在,我们把join()方法加进去(其他代码不变),看看有什么不一样,例子:

[python] view plain copy
  1. import threading
  2. import time
  3. class MyThread(threading.Thread):
  4. def __init__(self,id):
  5. threading.Thread.__init__(self)
  6. self.id = id
  7. def run(self):
  8. x = 0
  9. time.sleep(10)
  10. print self.id
  11. if __name__ == "__main__":
  12. t1=MyThread(999)
  13. t1.start()
  14. t1.join()
  15. for i in range(5):
  16. print i
执行后的结果是:

[python] view plain copy
  1. 999
  2. 0
  3. 1
  4. 2
  5. 3
  6. 4

机器上运行时,999之前,有明显的停顿。解释:线程t1 start后,主线程停在了join()方法处,等sleep(10)后,线程t1操作结束被join,接着,主线程继续循环打印。

2、setDaemon()方法。主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有个要特别注意的:必须在start() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。

例子:就是设置子线程随主线程的结束而结束:

[python] view plain copy
  1. import threading
  2. import time
  3. class MyThread(threading.Thread):
  4. def __init__(self,id):
  5. threading.Thread.__init__(self)
  6. def run(self):
  7. time.sleep(5)
  8. print "This is " + self.getName()
  9. if __name__ == "__main__":
  10. t1=MyThread(999)
  11. t1.setDaemon(True)
  12. t1.start()
  13. print "I am the father thread."

执行后的结果是:

[python] view plain copy
  1. I am the father thread.

可以看出,子线程t1中的内容并未打出。解释:t1.setDaemon(True)的操作,将父线程设置为了守护线程。根据setDaemon()方法的含义,父线程打印内容后便结束了,不管子线程是否执行完毕了。

程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法了。

所以,join和setDaemon的区别如上述的例子,它们基本是相反的。

Python中threading的join和setDaemon的区别及用法[例子]相关推荐

  1. Python中threading的join和setDaemon的区别及用法 例子

    Python中threading的join和setDaemon的区别及用法 Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别. 1.join ...

  2. Python中threading的join和setDaemon的区别及用法

    Python多线程编程时经常会用到join()和setDaemon()方法,基本用法如下: join([time]): 等待至线程中止.这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或 ...

  3. Python中read()、readline()和readlines()的区别和用法

    1..read()方法:读入全部内容,如果给出参数,读入前size长度: 2..readline()方法:读入一行内容,如果给出参数,读入该行前size长度: 3..readlines()方法:读入文 ...

  4. python threading join_Python中threading模块join函数用法实例分析

    本文实例讲述了Python中threading模块join函数用法.分享给大家供大家参考.具体分析如下: join的作用是众所周知的,阻塞进程直到线程执行完毕.通用的做法是我们启动一批线程,最后joi ...

  5. python中threading模块_python中threading模块详解

    python中threading模块详解,threading提供了一个比thread模块更高层的API来提供线程的并发性.这些线程并发运行并共享内存. 下面来看threading模块的具体用法: 一. ...

  6. python中os.path.join()的循环用法_python中使用os.path.join()

    os.path.join的详细解释请移步os.path模块 在使用的过程中,我使用如下代码: import os path = "F:/gts/gtsdate/" b = os.p ...

  7. python while if 区别_对python中for、if、while的区别与比较方法

    如下所示: if应用举例: #if 若条件成立,只执行一次 #if 条件:如果条件成立,执行条件后的代码块内容,不成立,直接跳过代码块 #判断如果年龄age小于18,输出未成年 #=一个等号表示赋值的 ...

  8. python的none是什么-python中的null与none有什么区别

    Python中none与null的区别有:none可以看作是一个具体的值用来初始化变量,而null表示空不是一个值,并且没有与任何一个值绑定并且存储空间也没有存储值 Python中所有的操作都是针对对 ...

  9. Python基础学习-Python中最常见括号()、[]、{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho

    Python基础学习-Python中最常见括号().[].{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho ...

最新文章

  1. 从芯片到AI智能芯片,一文了解它的前世今生
  2. Emmet:HTML/CSS代码快速编写规范(转发)
  3. Caffe 深度学习框架介绍
  4. 跨平台 获取系统信息的python库 http://support.hyperic.com/disp
  5. pythonmsgbox怎么使用_如何使用tkinter的messagebox
  6. mysqld: Can‘t create directory ‘D:\software\mysql-8.0.28-winx64\mysql-8.0.28-winx64\bin\ oftware\mys
  7. ubuntu+idea intellij配置android开发环境
  8. 基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)
  9. C++学习之路 | PTA(甲级)—— 1043 Is It a Binary Search Tree (25分)(带注释)(精简)
  10. [转载]如何学习ANSYS?
  11. 大数据之spark_spark SQL的建表语句
  12. 位移密码 nyist768
  13. 透明网桥(transparent bridge)
  14. 【JavaScript 教程】第六章 数组11— filter() :过滤数组中的元素
  15. 脚本(script)——通俗易懂去理解
  16. 《架构设计2.0大型分布式系统架构方法论与实践》三高笔记
  17. 《Designing and Training of A Dual CNN for Image Denoising》阅读笔记
  18. C++ 并发编程(C++11 到 C++17 )
  19. 2018拼多多校招【最大乘积】Python解法
  20. 2019年,实现 React 动画的 5 种最常用方式

热门文章

  1. 3g造就了电商,4g推动了微商,5g物联网的时代,能够成就什么?
  2. linux内核不发(Router Solicit)RS报文问题
  3. jupyter 写sql_了解适用于SQL Server的Jupyter Notebooks
  4. 为什么SQL Server DBA对Python感兴趣?
  5. 网络协议笔记-数据链路层
  6. Linux学习之CentOS6下Mysql数据库的安装与配置
  7. 2015 HUAS Summer Training#2 G
  8. handler 和 intent用法
  9. WindowsXP 下搭建PHP环境(笔记)
  10. 关于前端一周知识的总结