python多线程中join()的理解
在 Python 的多线程编程中,经常碰到 thread.join()这样的代码。那么今天咱们用实际代码来解释一下 join 函数的作用。
第一,当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束,例子见下面。
# coding: utf-8
# 测试多线程中join的功能
import threading, time
def doWaiting():
print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"
time.sleep(3)
print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"
def doWaiting1():
print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"
time.sleep(8)
print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"
tsk = []
thread1 = threading.Thread(target = doWaiting)
thread1.start()
tsk.append(thread1)
thread2 = threading.Thread(target = doWaiting1)
thread2.start()
tsk.append(thread2)
print 'start join: ' + time.strftime('%H:%M:%S') + "\n" print 'end join: ' + time.strftime('%H:%M:%S') + "\n"
代码执行结果如下:
start waiting1: 22:24:20 start join: 22:24:20
start waiting2: 22:24:20 end join: 22:24:20 stop waiting1: 22:24:23 stop waiting2: 22:24:28
第二,当我们使用setDaemon(True)方法,设置子线程为守护线程时,主线程一旦执行结束,则全部线程全部被终止执行,可能出现的情况就是,子线程的任务还没有完全执行结束,就被迫停止,例子见下面。
1 # coding: utf-8
2 # 测试多线程中join的功能
3 import threading, time
4 def doWaiting():
5 print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"
6 time.sleep(3)
7 print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"
8 def doWaiting1():
9 print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"
10 time.sleep(8)
11 print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"
12 tsk = []
13 thread1 = threading.Thread(target = doWaiting)
14 thread1.setDaemon(True)
15 thread1.start()
16 tsk.append(thread1)
17 thread2 = threading.Thread(target = doWaiting1)
18 thread2.setDaemon(True)
19 thread2.start()
20 tsk.append(thread2)
21 print 'start join: ' + time.strftime('%H:%M:%S') + "\n"
22
23 print 'end join: ' + time.strftime('%H:%M:%S') + "\n"
代码执行结果如下:
start waiting1: 22:34:46 start waiting2: 22:34:46
start join: 22:34:46 end join: 22:34:46
第三,没有设置守护线程且没有设置join函数的timeout参数时,主线程将会一直等待,直到子线程全部结束,主线程才结束,程序退出。代码如下:
1 # coding: utf-8
2 # 测试多线程中join的功能
3 import threading, time
4 def doWaiting():
5 print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"
6 time.sleep(3)
7 print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"
8 def doWaiting1():
9 print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"
10 time.sleep(8)
11 print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"
12 tsk = []
13 thread1 = threading.Thread(target = doWaiting)
14 thread1.start()
15 tsk.append(thread1)
16 thread2 = threading.Thread(target = doWaiting1)
17 thread2.start()
18 tsk.append(thread2)
19 print 'start join: ' + time.strftime('%H:%M:%S') + "\n"
20 for tt in tsk:
21 tt.join()
22 print 'end join: ' + time.strftime('%H:%M:%S') + "\n"
代码执行结果如下:
start waiting1: 22:41:50 start join: 22:41:50
start waiting2: 22:41:50 stop waiting1: 22:41:53 stop waiting2: 22:41:58 end join: 22:41:58
第四,当没有设置守护线程且join函数的参数timeout=2时,主线程将会等待多个子线程timeout的累加和这样的一段时间,时间一到,主线程结束,但是并没有杀死子线程,子线程依然可以继续执行,直到子线程全部结束,程序退出。代码如下:
1 # coding: utf-8
2 # 测试多线程中join的功能
3 import threading, time
4 def doWaiting():
5 print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"
6 time.sleep(3)
7 print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"
8 def doWaiting1():
9 print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"
10 time.sleep(8)
11 print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"
12 tsk = []
13 thread1 = threading.Thread(target = doWaiting)
14 thread1.start()
15 tsk.append(thread1)
16 thread2 = threading.Thread(target = doWaiting1)
17 thread2.start()
18 tsk.append(thread2)
19 print 'start join: ' + time.strftime('%H:%M:%S') + "\n"
20 for tt in tsk:
21 tt.join(2)
22 print 'end join: ' + time.strftime('%H:%M:%S') + "\n"
代码执行结果如下:
start waiting1: 23:02:34 start waiting2: 23:02:34
start join: 23:02:34 stop waiting1: 23:02:37 end join: 23:02:38 stop waiting2: 23:02:42
第五,当设置守护线程join函数的参数timeout=2时,主线程将会等待多个子线程timeout的累加和这样的一段时间,时间一到,主线程结束,杀死未执行完的子线程,程序退出。代码如下:
1 # coding: utf-8
2 # 测试多线程中join的功能
3 import threading, time
4 def doWaiting():
5 print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"
6 time.sleep(3)
7 print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"
8 def doWaiting1():
9 print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"
10 time.sleep(8)
11 print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"
12 tsk = []
13 thread1 = threading.Thread(target = doWaiting)
14 thread1.setDaemon(True)
15 thread1.start()
16 tsk.append(thread1)
17 thread2 = threading.Thread(target = doWaiting1)
18 thread2.setDaemon(True)
19 thread2.start()
20 tsk.append(thread2)
21 print 'start join: ' + time.strftime('%H:%M:%S') + "\n"
22 for tt in tsk:
23 tt.join(2)
24 print 'end join: ' + time.strftime('%H:%M:%S') + "\n"
代码执行结果如下:
start waiting1: 23:23:57 start waiting2: 23:23:57
start join: 23:23:57 stop waiting1: 23:24:00 end join: 23:24:01
python多线程中join()的理解的更多相关文章
- python多线程中join()方法和setDaemon()方法的区别
""" join()方法:主线程A中,创建了子线程B,并且在主线程中调用了B.join()方法,那么主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行 ...
- python 多线程中的同步锁 Lock Rlock Semaphore Event Conditio
摘要:在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lo ...
- 彻底理解Python多线程中的setDaemon与join【配有GIF示意】
在进行Python多线程编程时, join() 和 setDaemon() 是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B. ...
- [转]Python多线程与多线程中join()的用法
https://www.cnblogs.com/cnkai/p/7504980.html Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: 知 ...
- 多线程中join的解释(转)
文章来源:https://www.zhihu.com/question/61446671 这个join可以理解为“加入”,其含义与英语里面讲“Come on,join us”中的join类似.假设线程 ...
- 用C语言解决python多线程中的GIL问题
在使用python多线程的时候为了解决GIL问题,有些代码得用C语言写,那么就得生成动态链接库. 当创建动态链接库时,独立位置信息(position independent)代码也需要生成.这可以帮助 ...
- Python多线程与多线程中join()的用法
多线程实例 https://www.cnblogs.com/cnkai/p/7504980.html 知识点一:当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时 ...
- 转载:Java多线程中join方法的理解
转载自:http://uule.iteye.com/blog/1101994 thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A ...
- Java多线程中join方法的理解
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. t.join( ...
随机推荐
- Java并发(九)【转载】不可不说的Java“锁”事
转载自 美团技术团队,原文链接 不可不说的Java“锁”事 前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK ...
- CF553E Kyoya and Train
Kyoya and Train 一个有\(n\)个节点\(m\)条边的有向图,每条边连接了\(a_i\)和\(b_i\),花费为\(c_i\). 每次经过某一条边就要花费该边的\(c_i\). 第\( ...
- SHOI2008 cactus仙人掌图 和 UOJ87 mx的仙人掌
cactus仙人掌图 题目描述 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一 ...
- java 获取某年某月最后一天
Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, 2016); calendar.set(Calendar ...
- Excel技巧大全
1.一列数据同时除以10000 复制10000所在单元格,选取数据区域 - 选择粘性粘贴 - 除 2.同时冻结第1行和第1列 选取第一列和第一行交汇处的墙角位置B2,窗口 - 冻结窗格 3.快速把公式 ...
- CSP2019 D2T2 划分 (单调队列DP)
题目 洛谷传送门 题解 就是这道题搞我退役考场上写了n^2 64分,结果爆成8-12分.直接GG. 考场上想到正解的写法被自己否决了 题解传送门(看到这道送我退役的题目⑧太想写题解) 六行O(n2)O ...
- 项目读取数据,一直出现 Closing connections idle longer than 30 SECONDS,卡死现象
项目读取数据,一直出现 Closing connections idle longer than 30 SECONDS,卡死现象. 我的是在读取oracle数据的时候出现这种错误. 可以参考这篇文章 ...
- Springboot-data-jpa增删改查
导入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/ ...
- python django -在setting 设定全局时间格式
工作中遇到需要全局设定时间的格式,再此马克下 USE_L10N = False DATE_FORMAT = 'Y-m-d' DATETIME_FORMAT = 'Y年m月'
- MongoDB 复制集监控
1.复制集状态查询:rs.status() 2.查看当前副本集oplog状态:rs.printReplicationInfo() 3.查看复制延迟:rs.printSlaveReplicationIn ...