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( ...
随机推荐
- Python 冒泡排序只适用位数相同,位数不同用a.sort()方法
数组内容双位数排序: #coding:utf-8 print u"中文" a = ['] b = 0 c = 0 print a i =0 for j in range (len( ...
- koa2-router中间件来请求数据获取
原理 虽然不使用中间件也能获取请求数据 对于POST请求的处理,koa-bodyparser中间件可以把koa2上下文的formData数据解析到ctx.request.body中. 安装koa2版本 ...
- 错误信息: Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
这个错误主要原因是:数据库的配置出问题,比如写错库名什么的,仔细检查下.
- mui真机调试时无法查找到手机
在做mui的真机调试时手机查找不到手机,有可能是你的 adb interface 驱动 版本过低,先下载 或自行百度 http://www.onlinedown.net/soft/1164054. ...
- 洛谷 AT2434 JOI 公園 (JOI Park) 题解
人生第一次AC黑题,我太感动了. 每日一题 day31 打卡 Analysis 先跑遍DJ,求出1到 i的最短路.得到每个点到 1号点的距离后,从小到大排序一遍,这时便可以枚举每个点到 1号点的距离修 ...
- S1_搭建分布式OpenStack集群_01 准备虚拟机
Openstack版本:openstack-queen 版本 一.环境准备 网络规划: Management + API Network:10.10.11.0/24 eth1 网桥:br1 VM ...
- C二维数组用指针地址遍历
#include <stdio.h> #include <stdlib.h> int main(){ int a = 100; void *p = &a; printf ...
- Vim初学
实现G++编译 1,首先下载安装MinGW,下载地址在http://sourceforge.net/projects/mingw/.这个是边下载边安装的,下载完成即安装完成.我的安装目录是G:\Min ...
- python 之 列表常用 操作
- 《挑战30天C++入门极限》c++中指针学习的两个绝好例子
c/c++中指针学习的两个绝好例子 对于众多人提出的c/c++中指针难学的问题做个总结: 指针学习不好关键是概念不清造成的,说的简单点就是书没有认真看,指针的学习犹如人在学习饶口令不多看多学多 ...