Python中threading的join和setDaemon的区别及用法
Python多线程编程时经常会用到join()和setDaemon()方法,基本用法如下:
1、join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法。
原型:join([timeout]),里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接着执行的。
import threading
import time class MyThread(threading.Thread):
def __init__(self, id):
threading.Thread.__init__(self)
self.id = id def run(self):
x = 0
time.sleep(10)
print(self.id)
print('线程结束:'+str(time.time())) if __name__ == "__main__":
t1 = MyThread(999)
print('线程开始:'+str(time.time()))
t1.start()
print('主线程打印开始:'+str(time.time()))
for i in range(5):
print(i)
time.sleep(2)
print('主线程打印结束:' + str(time.time()))
线程开始:1497534590.2784667
主线程打印开始:1497534590.2794669
主线程打印结束:1497534592.279581
线程结束:1497534600.2800388
从打印结果可知,线程t1 start后,主线程并没有等线程t1运行结束后再执行,而是在线程执行的同时,执行了后面的语句。
现在,把join()方法加到启动线程后面(其他代码不变)
import threading
import time class MyThread(threading.Thread):
def __init__(self, id):
threading.Thread.__init__(self)
self.id = id def run(self):
x = 0
time.sleep(10)
print(self.id)
print('线程结束:'+str(time.time())) if __name__ == "__main__":
t1 = MyThread(999)
print('线程开始:'+str(time.time()))
t1.start()
t1.join()
print('主线程打印开始:'+str(time.time()))
for i in range(5):
print(i)
time.sleep(2)
print('主线程打印结束:' + str(time.time()))
线程开始:1497535176.5019968
线程结束:1497535186.5025687
主线程打印开始:1497535186.5025687
主线程打印结束:1497535188.5026832
线程t1 start后,主线程停在了join()方法处,等子线程t1结束后,主线程继续执行join后面的语句。
2、setDaemon()方法。主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有个要特别注意的:必须在start() 方法调用之前设置。
import threading
import time class MyThread(threading.Thread):
def __init__(self, id):
threading.Thread.__init__(self)
self.id = id def run(self):
x = 0
time.sleep(10)
print(self.id)
print("This is:" + self.getName()) # 获取线程名称
print('线程结束:' + str(time.time())) if __name__ == "__main__":
t1 = MyThread(999)
print('线程开始:'+str(time.time()))
t1.setDaemon(True)
t1.start()
print('主线程打印开始:'+str(time.time()))
for i in range(5):
print(i)
time.sleep(2)
print('主线程打印结束:' + str(time.time()))
线程开始:1497536678.8509264
主线程打印开始:1497536678.8509264
主线程打印结束:1497536680.8510408
t1.setDaemon(True)的操作,将子线程设置为了守护线程。根据setDaemon()方法的含义,父线程打印内容后便结束了,不管子线程是否执行完毕了。
如果在线程启动前没有加t1.setDaemon(True),输出结果为:
线程开始:1497536865.3215919
主线程打印开始:1497536865.3215919
主线程打印结束:1497536867.3217063
This is:Thread-1
线程结束:1497536875.3221638
程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成,如果子线程未完成,则主线程会等待子线程完成后再退出;
有时我们需要的是,子线程运行完,才继续运行主线程,这时就可以用join方法(在线程启动后面);
但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法(在线程启动前面)。
参考:
Python中threading的join和setDaemon的区别及用法的更多相关文章
- Python中threading的join和setDaemon的区别及用法[例子]
Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别. 1.join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join() ...
- Python中threading的join和setDaemon的区别[带例子]
python的进程和线程经常用到,之前一直不明白threading的join和setDaemon的区别和用法,今天特地研究了一下.multiprocessing中也有这两个方法,同样适用,这里以thr ...
- python中threading模块详解(一)
python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...
- python中filter、map、reduce的区别
python中有一些非常有趣的函数,今天也来总结一下,不过该类的网上资料也相当多,也没多少干货,只是习惯性将一些容易遗忘的功能进行整理. lambda 为关键字.filter,map,reduce为内 ...
- python中的filter、map、reduce、apply用法
1. filter 功能: filter的功能是过滤掉序列中不符合函数条件的元素,当序列中要删减的元素可以用某些函数描述时,就应该想起filter函数. 调用: filter(function,seq ...
- python中dtype,type,astype的区别
python中dtype,type,astype的区别 type() dtype() astype() 函数名称 用法 type 返回参数的数据类型 dtype 返回数组中元素的数据类型 astype ...
- angularjs中provider,factory,service的区别和用法
angularjs中provider,factory,service的区别和用法 都能提供service,但是又有差别 service 第一次被注入时实例化,只实例化一次,整个应用的生命周期中是个单例 ...
- 转 Java中final、finally、finalize的区别与用法
Java中final.finally.finalize的区别与用法 1.简单区别:final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承.finally是异常处理语句结构 ...
- python中threading的用法
摘自:http://blog.chinaunix.net/uid-27571599-id-3484048.html 以及:http://blog.chinaunix.net/uid-11131943- ...
随机推荐
- 在平衡树的海洋中畅游(一)——Treap
记得有一天翔哥毒奶我们: 当你们已经在平衡树的海洋中畅游时,我还在线段树的泥沼中挣扎. 我觉得其实像我这种对平衡树一无所知的蒟蒻也要开一开数据结构了. 然后花了一天啃了下最简单的平衡树Treap,感觉 ...
- 通用漏洞评估方法CVSS3.0简表
CVSS3.0计算分值共有三种维度: 1. 基础度量. 分为 可利用性 及 影响度 两个子项,是漏洞评估的静态分值. 2. 时间度量. 基础维度之上结合受时间影响的三个动态分值,进而评估该漏洞的动态分 ...
- 1017 B. The Bits
链接 [http://codeforces.com/contest/1017/problem/B] 题意 给你两个长度为n,包含0和1的字符串a和b,有一种操作swap a中的任意两个字符使得a&am ...
- 四则运算 C 语言
#include<stdio.h>void main(){ char c; float x,y; int result; scanf("%c %f %f",&c ...
- 【个人阅读】软件工程M1/M2做一个总结
1.以前博客链接 http://www.cnblogs.com/penglinjiang/p/4027850.html http://www.cnblogs.com/penglinjiang/p/40 ...
- 【Beta版本发布】爬虫队长装备全面更新!
一.Beta阶段目标回顾 1.为了解决Alpha阶段线程异常泛滥的问题,我们需要一个线程池. 2.为了爬取得到的文件正确可用,我们需要一个异常清理器. 3.为了不间断爬取,管理员不必频繁运行程序点,我 ...
- github个人心得和链接
github使用心得: 在本次github使用过程中,我总结了git常用命令,都有哪些功能? git常用命令: git config :配置git git add:更新working director ...
- 剑指offer:复杂链表的复制
题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用, ...
- HDOJ2010_水仙花数
一道水题.一直出现Output Limit Exceeded的原因是在while循环中没有终止条件的时候会自动判断并报错,写的时候忘记加!=EOF结束标识了. HDOJ2010_水仙花数 #inclu ...
- JavaScript代码-----位置决定结果
刚学JavaScript的时候,即使照着书上的代码敲一遍,运行的时候,得到的结果要么总是和书上的结果不同,要么是没产生效果.学到后面,才明白到其实程序的代码是没错的,错误的是代码的位置! 首先看下面这 ...