一直没有太搞清楚join和setDaemon有什么区别,总是对于它们两个的概念很模糊,需要做个实验然后记录一下。

先说结论:

join: 子线程合并到主线程上来的作用,就是当主线程中有子线程join的地方,那主线程就在此等改子线程执行完毕再执行主线程后续的语句。那如果没有join主线程就一直自己执行到底。

setDaemon: 主线程销毁子线程要不要根主线程一起销毁,False就是不一起销毁,也就是意味着主线程执行完毕,子线程还在自顾自的执行,而True就是一起销毁主线程结束,子线程也结束。

通俗点说就是,join的意思是子线程告诉主线程,你要在这个位置(设置join的位置)等我执行完毕你再往下执行;setDaemon则是设置主线程死的时候要不要带子线程一起。

实验如下:

  1. 我们看看加join和不加join
#!/usr/bin/env python
#-*- coding:utf8 -*- import threading
import time def test_fun(n):
for i in range(n):
print i
time.sleep(1) # test join t = threading.Thread(target=test_fun, args=(5,), name="t1")
t.setDaemon(True)
t.start()
print "lets join"
t.join()
print "END"

不注释t.join()程序输出如下:

0
lets join
1
2
3
4
END

注释t.join()程序输出如下:

0
END

可以看出不注释的时候主线程不等子线程执行完毕,自己就退出了。

  1. 在看setDaemon为True和False的情况
#!/usr/bin/env python
#-*- coding:utf8 -*- import threading
import time def test_fun(n):
for i in range(n):
print i
time.sleep(1)
print "SUB END" # test setDaemon t = threading.Thread(target=test_fun, args=(5,), name="t1")
t.setDaemon(False)
t.start() print "MAIN END"

为False的时候输出结果如下:

0MAIN END

1
2
3
4
SUB END

可以看出主线程结束了,子线程没有跟着一起死

为True的时候输出结果如下:

0MAIN END

可以看出主线程死了,子线程就不执行了跟着死了

Python多线程join和setDaemon区别与用法的更多相关文章

  1. 彻底理解Python多线程中的setDaemon与join【配有GIF示意】

    在进行Python多线程编程时, join() 和 setDaemon() 是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B. ...

  2. python多线程与多进程及其区别

    个人一直觉得对学习任何知识而言,概念是相当重要的.掌握了概念和原理,细节可以留给实践去推敲.掌握的关键在于理解,通过具体的实例和实际操作来感性的体会概念和原理可以起到很好的效果.本文通过一些具体的例子 ...

  3. Python多线程join/setDaemon

    import threading, time class Test(): def test1(self): print("--") time.sleep(3) print(&quo ...

  4. Python多线程join的用法

    import threading, time def Myjoin(): print 'hello world!' time.sleep(1) for i in range(5): t=threadi ...

  5. python 多线程和多进程的区别 mutiprocessing theading

    多线程可以共享全局变量,多进程不能.多线程中,所有子线程的进程号相同:多进程中,不同的子进程进程号不同. #!/usr/bin/python # -*- coding:utf-8 -*- import ...

  6. 20.多线程.join()和setDaemon()的使用

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

  7. python多线程与多进程的区别

    在UNIX平台上,当某个进程终结之后,该进程需要被其父进程调用wait,否则进程成为僵尸进程(Zombie).所以,有必要对每个Process对象调用join()方法 (实际上等同于wait).对于多 ...

  8. python面试题之python多线程与多进程的区别

    多线程可以共享全局变量,多进程不能 多线程中,所有子线程的进程号相同,多进程中,不同的子进程进程号不同 线程共享内存空间:进程的内存是独立的 同一个进程的线程之间可以直接交流:两个进程想通信,必须通过 ...

  9. Python线程join和setDaemon

    看一下线程的setDaemon()方法 import time import threading import ctypes import inspect def sayHello(): for i ...

随机推荐

  1. Luogu P3757 [CQOI2017]老C的键盘

    题目描述 老C的键盘 题解 显然对于每个数 x 都有唯一对应的 \(x/2\) , 然而对于每个数 x 却可以成为 \(x*2\) 和 \(x*2+1\) 的对应数 根据这一特性想到了啥??? 感谢l ...

  2. 使用Azure静态Web应用部署Blazor Webassembly应用

    上一次演示了如何使用Azure静态web应用部署VUE前端项目(使用 Azure静态web应用+Github全自动部署VUE站点).我们知道静态web应用支持VUE,react,angular等项目的 ...

  3. Js模块化开发的理解

    Js模块化开发的理解 模块化是一个语言发展的必经之路,其能够帮助开发者拆分和组织代码,随着前端技术的发展,前端编写的代码量也越来越大,就需要对代码有很好的管理,而模块化能够帮助开发者解决命名冲突.管理 ...

  4. Docker(4)- Docker 命令大全

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 容器生命周期管理 run sta ...

  5. c#视频位置

    static void Main(string[] args)        { string scoure = @"C:\Documents and Settings\Administra ...

  6. MVC中Cookie的用法(二)---CookieHelper

    public class CookieHelper { /// <summary> /// 1.1添加Cookie /// </summary> /// <param n ...

  7. leetcode1Minimum Depth of Binary Tree

    题目描述 求给定二叉树的最小深度.最小深度是指树的根结点到最近叶子结点的最短路径上结点的数量. Given a binary tree, find its minimum depth.The mini ...

  8. 5.MVCC

    5 MVCC ​ 全称是Multi-Version Concurrent Control,即多版本并发控制,在MVCC协议下,每个读操作会看到一个一致性的snapshot,并且可以实现非阻塞的读.MV ...

  9. CentOS7下一键小白搭建seafile pro云盘

    搭建前准备工作 vps或者云服务器,个人搭建使用建议腾讯云,公司搭建使用建议阿里云. 没有服务器的小伙伴可以下面链接进入看下,腾讯云的配置带宽会比阿里云的好点. 阿里云新人优惠服务器 腾讯云云上特惠 ...

  10. <摘自>飞:jxl简析2 [ http://www.emlog.net/fei ]

    [<摘自>飞:jxl简析:http://www.emlog.net/fei] (二)应用 在进行实践前 , 我们需要对 excel 有一个大致的了解 ,excel 文件由一个工作簿 (Wo ...