Python多线程join和setDaemon区别与用法
一直没有太搞清楚join和setDaemon有什么区别,总是对于它们两个的概念很模糊,需要做个实验然后记录一下。
先说结论:
join: 子线程合并到主线程上来的作用,就是当主线程中有子线程join的地方,那主线程就在此等改子线程执行完毕再执行主线程后续的语句。那如果没有join主线程就一直自己执行到底。
setDaemon: 主线程销毁子线程要不要根主线程一起销毁,False就是不一起销毁,也就是意味着主线程执行完毕,子线程还在自顾自的执行,而True就是一起销毁主线程结束,子线程也结束。
通俗点说就是,join的意思是子线程告诉主线程,你要在这个位置(设置join的位置)等我执行完毕你再往下执行;setDaemon则是设置主线程死的时候要不要带子线程一起。
实验如下:
- 我们看看加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
可以看出不注释的时候主线程不等子线程执行完毕,自己就退出了。
- 在看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区别与用法的更多相关文章
- 彻底理解Python多线程中的setDaemon与join【配有GIF示意】
在进行Python多线程编程时, join() 和 setDaemon() 是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B. ...
- python多线程与多进程及其区别
个人一直觉得对学习任何知识而言,概念是相当重要的.掌握了概念和原理,细节可以留给实践去推敲.掌握的关键在于理解,通过具体的实例和实际操作来感性的体会概念和原理可以起到很好的效果.本文通过一些具体的例子 ...
- Python多线程join/setDaemon
import threading, time class Test(): def test1(self): print("--") time.sleep(3) print(&quo ...
- Python多线程join的用法
import threading, time def Myjoin(): print 'hello world!' time.sleep(1) for i in range(5): t=threadi ...
- python 多线程和多进程的区别 mutiprocessing theading
多线程可以共享全局变量,多进程不能.多线程中,所有子线程的进程号相同:多进程中,不同的子进程进程号不同. #!/usr/bin/python # -*- coding:utf-8 -*- import ...
- 20.多线程.join()和setDaemon()的使用
1.join()方法 join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这 ...
- python多线程与多进程的区别
在UNIX平台上,当某个进程终结之后,该进程需要被其父进程调用wait,否则进程成为僵尸进程(Zombie).所以,有必要对每个Process对象调用join()方法 (实际上等同于wait).对于多 ...
- python面试题之python多线程与多进程的区别
多线程可以共享全局变量,多进程不能 多线程中,所有子线程的进程号相同,多进程中,不同的子进程进程号不同 线程共享内存空间:进程的内存是独立的 同一个进程的线程之间可以直接交流:两个进程想通信,必须通过 ...
- Python线程join和setDaemon
看一下线程的setDaemon()方法 import time import threading import ctypes import inspect def sayHello(): for i ...
随机推荐
- Java 8新特性解读
(四)Java 8 相关知识 关于 Java 8 中新知识点,面试官会让你说说 Java 8 你了解多少,下面分享一我收集的 Java 8 新增的知识点的内容,前排申明引用自:Java8新特性及使用 ...
- Java数据结构-01顺序表
一.定义 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列. 二.存储分类 1.顺序存储: ①简述:是指将线性表中的各个元素依次存放在一组地址连续的存储单元中,通常将这种方 ...
- 【转】Setting up SDL 2 on Visual Studio 2019 Community
FROM: http://lazyfoo.net/tutorials/SDL/01_hello_SDL/windows/msvc2019/index.php Setting up SDL 2 on V ...
- 4G DTU是什么 可以应用于哪些行业?
4G是什么? 4G是移动电话网络通过蜂窝塔传输的信号的名称,蜂窝塔连接到更宽的互联网.这些是当今智能手机使用的信号,当您外出时,可以通过手机上网,因此他们不依赖电缆或光纤,也就是说无线网. 使用合适的 ...
- "!"的应用(以C++为例)
1. "!"在条件语句中仅作逻辑判断使用并不影响变量的值 2. "!"在赋值类语句中会改变变量的值(非零->0,0->1)
- Serilog源码解析——使用方法
在上两篇文章(链接1和链接2)中,我们通过一个简易 demo 了解到了一个简单的日志记录类库所需要的功能,即一条日志有哪些数据,以及如何通过一次记录的方式将同一条日志消息记录到多个日志媒介中.在本文中 ...
- 第一行代码中RecyclerView添加依赖库问题
现在更新到 implementation 'com.android.support:recyclerview-v7:29.2.1' 记得点Sync Now来进行同步.
- mysql存储过程加事务
create procedure sp_sw2() begin declare error int default 0; declare continue handler for SQLEXCEPTI ...
- 剑指Offer-Python(11-15)
11.二进制中1的个数 链接:https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8?answerType ...
- 转载:WIFI无线协议802.11a/b/g/n/ac的演变以及区别
WIFI无线协议802.11a/b/g/n/ac的演变以及区别 版权声明:版权所有,转载须注明出处. https://blog.csdn.net/Brouce__Lee/article/details ...