Python中threading的join和setDaemon的区别[带例子]
python的进程和线程经常用到,之前一直不明白threading的join和setDaemon的区别和用法,今天特地研究了一下。multiprocessing中也有这两个方法,同样适用,这里以threading的join和setDaemon举例。
1、join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法。
原型:join([timeout])
里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接着执行的。
例子:
# -*- coding: utf-8 -*- from threading import Thread
from time import sleep def search():
sleep(5)
print 2 if __name__ == '__main__':
t = Thread(target=search)
t.start()
# t.join()
print 1
执行后的结果:
运行后,当打印完1停顿了5秒后才打印2。解释:线程t开始后,需要睡5s,主线程并没有等待线程t执行完,就开始往下执行。
现在,我们把t.join()注释去掉(其他代码不变),看看有什么变化,例子:
# -*- coding: utf-8 -*- from threading import Thread
from time import sleep def search():
sleep(5)
print 2 if __name__ == '__main__':
t = Thread(target=search)
t.start()
t.join()
print 1
执行后的结果:
2
1
运行后,发现停顿了5秒后才打印2,然后立即打印了1。解释:当程序运行到t.join()时,停在了t.join()处,等待线程t执行完,然后开始往下执行。
2.
2、setDaemon()方法。主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出,这就是setDaemon方法的含义。此外,还有个要特别注意的:必须在start() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。
例子:
from threading import Thread
from time import sleep def search():
for i in range(5):
sleep(1)
print 2 if __name__ == '__main__':
t = Thread(target=search)
# t.setDaemon(True)
t.start()
print 1
执行后的结果:
1
2
2
2
2
2
运行过程中,程序还没运行完时,关闭程序。会发现程序还在打印2。这是因为主线程默认等待线程t执行完才关闭,主线程执行完,子线程t没有执行完,程序就被挂起,一直等待子线程执行完毕。
现在,我们把t.setDaemon(True)的注释删掉,再执行查看结果。例子:
# -*- coding: utf-8 -*- from threading import Thread
from time import sleep def search():
for i in range(5):
sleep(1)
print 2 if __name__ == '__main__':
t = Thread(target=search)
t.setDaemon(True)
t.start()
print 1
执行结果:
1
执行发现,程序在打印完1后就停止了。这是因为主线程执行完以后,不再等待子线程是否执行完,立马结束。
threading的join和setDaemon的区别总结:如果主线程中调用了join(),程序会阻塞在调用处,直到子线程执行完才往下执行。如果没调用,主线程则无需等待,直接往下执行。如果主线程中调用了setDaemon(True),则当程序关闭或者执行完后,子线程立马关闭,不管其是否执行完。如果主线程中没有调用setDaemon(True),则当程序关闭或者执行完后,子线程会继续执行,直到执行完。join管阻塞,setDaemon管结束。
正常开发中,当开启了多线程,为了不让程序阻塞,同时主线程关闭时,子线程能够都同时关闭,会用下面的方法。
# -*- coding: utf-8 -*- from threading import Thread
from time import sleep def search():
for i in range(5):
sleep(1)
print 2 def insert():
for i in range(5):
sleep(0.9)
print 3 if __name__ == '__main__':
task1 = Thread(target=search)
task2 = Thread(target=insert)
task1.setDaemon(True)
task2.setDaemon(True)
task1.start()
task2.start()
while True:
sleep(10)
Python中threading的join和setDaemon的区别[带例子]的更多相关文章
- Python中threading的join和setDaemon的区别及用法[例子]
Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别. 1.join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join() ...
- Python中threading的join和setDaemon的区别及用法
Python多线程编程时经常会用到join()和setDaemon()方法,基本用法如下: join([time]): 等待至线程中止.这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或 ...
- python中threading模块详解(一)
python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...
- python中dtype,type,astype的区别
python中dtype,type,astype的区别 type() dtype() astype() 函数名称 用法 type 返回参数的数据类型 dtype 返回数组中元素的数据类型 astype ...
- python中threading的用法
摘自:http://blog.chinaunix.net/uid-27571599-id-3484048.html 以及:http://blog.chinaunix.net/uid-11131943- ...
- Python中os与sys两模块的区别
<os和sys的官方解释> ➤os os: This module provides a portable way of using operating system dependent ...
- Python基础学习-Python中最常见括号()、[]、{}的区别
Python中最常见括号的区别: 在Python语言中最常见的括号有三种,分别是:小括号().中括号[].花括号{}:其作用也不相同,分别用来代表不同的Python基本内置数据类型. Python中的 ...
- 关于python中赋值、浅拷贝、深拷贝之间区别的深入分析
当重新学习了计算机基础课程<数据结构和算法分析>后再来看这篇自己以前写的博文,发现错误百出.python内置数据类型之所以会有这些特性,归根结底是它采用的是传递内存地址的方式,而不是传递真 ...
- Python中function(函数)和methon(方法)的区别
在Python中,对这两个东西有明确的规定: 函数function —— A series of statements which returns some value to a caller. It ...
随机推荐
- VS2015 : error LNK1168
VC在重新生成Debug目录下的exe文件时,需要先删除原先的exe文件.但因为文件正在运行或是被锁定等原因,删除不了,于是出现 LNK1168错误.可以到任务管理器先将exe文件关闭,一个简单粗暴的 ...
- TCP常用方法
//格式化为16进制输出指令 function fromateSendCode($code){ $codeArr = getCodeWithSpace($code); for($i=0; $i< ...
- SSIS Passing Parameters to an ADO .NET Source query;向ado.net数据源传递参数。
使用SSIS的oledb数据源时的参数按钮如下图: 但是在使用ADO.NET源连接到MYSQL时,没有这个参数按钮,如何向数据流的sql command传递参数呢? steps: 1. 在 控制流 选 ...
- python __new__ __init__ 区别
参数 __new__的第一个占位参数是class对象 __init__的第一个占位参数是class的实例对象 其他的参数应一致 作用 __new__ 用来创建实例,在返回的实例上执行__init__, ...
- CSS修改Autocomplete样式
举个场景:在用户登录成功的时候,浏览器有时候会咨询你是否记住密码,当你记住密码下次登录的时候,标签会自动填充,但是这样会造成样式不统一,解决办法如下: input:-webkit-autofill, ...
- 谈PHP中的钩子
钩子,英文为hooks.在程序中应用相当广泛,但是究竟什么是钩子呢?本人介绍一下目前本人对钩子的理解和相关心得. 假如有这么一段程序流: function fun(){ funA(); funB(); ...
- Linux 安装reids
1.下载: wget http://download.redis.io/releases/redis-3.0.0.tar.gz 2.解压: .tar.gz 3.安装: cd /redis- make ...
- PHP知识点总结4
file1.php <?php namespace Foo\Bar\subnamespace; const FOO = 1; function foo() {} class foo { stat ...
- wine使用
wineqq 不能输入问题winecfg在 wine 设置里,选择函数库添加 riched20, 就行了(原装领先于内建) wineqq 可以输入不能输入中文问题原因:fictx组件缺失 搜狗输入法没 ...
- IE下的圆角
元素{ position: relative;/*必须*/ z-index: 10;/*必须*/ border-radius: 8px; -moz-border-radius: 8px; -webki ...