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

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

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

原型:join([timeout])

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

例子:

[python] view plain copy print?
  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
import threading
import time
class MyThread(threading.Thread):def __init__(self,id):threading.Thread.__init__(self)self.id = iddef run(self):x = 0time.sleep(10)print self.idif __name__ == "__main__":t1=MyThread(999)t1.start()for i in range(5):print i

执行后的结果是:

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

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

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

[python] view plain copy print?
  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
import threading
import time
class MyThread(threading.Thread):def __init__(self,id):threading.Thread.__init__(self)self.id = iddef run(self):x = 0time.sleep(10)print self.idif __name__ == "__main__":t1=MyThread(999)t1.start()t1.join()for i in range(5):print i
执行后的结果是:

[python] view plain copy print?
  1. 999
  2. 0
  3. 1
  4. 2
  5. 3
  6. 4
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() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。

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

[python] view plain copy print?
  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."
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."

执行后的结果是:

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

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

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

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

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

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

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

  2. Python中threading的join和setDaemon的区别及用法[例子]

    Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别. 1.join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.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. centos7给MySQL配置环境变量
  2. 对quake3源代码的学习与研究初步的计划
  3. SpringMVC自动配置||如何修改SpringBoot的默认配置
  4. python学习之 字符串前'r'的用法
  5. LeetCode 1284. 转化为全零矩阵的最少反转次数(BFS 矩阵状态编码解码)
  6. Vue项目 报错TypeError [ERR INVALID ARG TYPE]: The “path“ argument must be of type string
  7. BZOJ 4810 [Ynoi2017]由乃的玉米田(莫队+bitset)
  8. 解决sqlalchemy连接mysql报错ModuleNotFoundError: No module named ‘pymysql‘
  9. mysql 最左_mysql索引最左匹配原则
  10. 甲骨文每季安全更新再修补297个漏洞
  11. linux命令 语法 pdf,Linux命令详解词典pdf
  12. 分享一点写掘金小册的经验和心得
  13. 获取随机经纬度、经纬度范围
  14. sql注入搞事情(连载一)
  15. Spider爬虫框架之Spiders模块
  16. pythonBBS问答社区程序源码加文档加说明
  17. 51单片机之系统指令
  18. 外企8年,我学到的人性化,不止是宽容
  19. 学无人机需要精通计算机吗,无人机航测没有那么难,掌握软件应用及流程就可以上路了...
  20. php排版工具下载,论文自动排版工具下载

热门文章

  1. matlab的边缘检测方法,MATLAB应用—Matlab多种图像边缘检测方法
  2. XSLT - 利用template实现for循环
  3. 求生之路怎么显示服务器,求生之路怎么搭建云服务器
  4. mysql的关键词使用顺序_sql关键词执行先后顺序是什么
  5. java安装_使用Java 9模块化来发布零依赖本机应用程序
  6. jakarta_适用于Java EE / Jakarta EE开发人员的Micronaut
  7. idea配置jfinal_intellij idea安装与配置(Java开发配置篇)
  8. python venv 复制_pythonenv的安装及迁移
  9. catia圆柱转化为圆台_浅析actran气动噪声仿真技术,以圆柱绕流气动噪声仿真为例...
  10. 为什么不建议在代码中使用 User 这个单词?