python线程join
几个事实
1 python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样
2 如果创建线程,并且设置了daemon为true,即thread.setDaemon(True), 则主线程执行完毕后自动退出,不会等待子线程的执行结果。而且随着主线程退出,子线程也消亡。
3 join方法的作用是阻塞,等待子线程结束,join方法有一个参数是timeout,即如果主线程等待timeout,子线程还没有结束,则主线程强制结束子线程。
4 如果线程daemon属性为False, 则join里的timeout参数无效。主线程会一直等待子线程结束。
5 如果线程daemon属性为True, 则join里的timeout参数是有效的, 主线程会等待timeout时间后,结束子线程。此处有一个坑,即如果同时有N个子线程join(timeout),那么实际上主线程会等待的超时时间最长为 N * timeout, 因为每个子线程的超时开始时刻是上一个子线程超时结束的时刻。
测试代码
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
import threading,timedef func():print "start thread time: ",time.strftime('%H:%M:%S')time.sleep(3)print "stop thread time: ",time.strftime('%H:%M:%S')thread_list = []
for i in range(3):t1 = threading.Thread(target=func)#t1.setDaemon(True)thread_list.append(t1)for r in thread_list:r.start()for t in thread_list:#t.join(1)t.join()
print "stop main thread"###子线程如果设置了t.join(timeout),则根据timeout的不同,结果会不同,前提是设置了setDaemon(True),否则join的timeout是没效的#设置了setDaemon(True),但是没设置t.join()的运行结果:
#start thread time: 17:25:29
#start thread time: 17:25:29
#start thread time: 17:25:29
#stop main thread#加了t1.setDaemon(True),并且设置了超时时间t.join(1)的运行结果:
#start thread time: 17:12:24
#start thread time: 17:12:24
#start thread time: 17:12:24
#stop main thread#没加t1.setDaemon(True),并且设置了超时时间t.join(1)的运行结果,不过因为setDaemon的参数不是True所以就算设置了超时时间也没用:
#start thread time: 17:13:28
#start thread time: 17:13:28
#start thread time: 17:13:28
#stop main thread
#stop thread time: 17:13:31
#stop thread time: 17:13:31
#stop thread time: 17:13:31#没加t1.setDaemon(True),但是设置了t.join(),没有超时时间的阻塞的运行结果:
#start thread time: 17:16:12
#start thread time: 17:16:12
#start thread time: 17:16:12
#stop thread time: 17:16:15
#stop thread time: 17:16:15
#stop thread time: 17:16:15
#stop main thread #即没有设置setDaemon(True),也没有设置join()的运行结果:
#start thread time: 17:22:25
#start thread time: 17:22:25
#start thread time: 17:22:25
#stop main thread
#stop thread time: 17:22:28
#stop thread time: 17:22:28
#stop thread time: 17:22:28
总结:
如果想让子进程正常的运行结束(子进程中所有的内容都运行了),则如果设置join(timeout)的话,前提是设置setDaemon(True),且setDaemon的参数为True,且join(timeout)的超时时间必须大于子进程执行所需的时间,不然没等子进程运行结束就超时退出了.或者直接设置join()不带超时时间,也不用设置setDaemon(True)了
python线程join相关推荐
- Python线程join和setDaemon
看一下线程的setDaemon()方法 import time import threading import ctypes import inspectdef sayHello():for i in ...
- python线程join方法_Python多线程join()用法
Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: 知识点一:主进程结束,子进程继续执行 当一个进程启动之后,会默认产生一个主线程,因为线程是程 ...
- python线程join方法
前言: join方法的作用是同步线程. 1.不使用join方法: 当设置多个线程时,在一般情况下(无守护线程,setDeamon=False),多个线程同时启动,主线程执行完,会等待其他子线程执行完, ...
- python等待线程结束_python线程join
几个事实 1 python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样 2 如果创建线程,并且设置了daemon为true,即thread.se ...
- python3 线程池源码解析_5分钟看懂系列:Python 线程池原理及实现
概述 传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器 ...
- python 线程锁 共享全局变量 线程通信
python 线程锁 共享全局变量 线程通信 注意:全局变量不必做为参数传到函数里!!! import threading # 银行存钱和取钱 # 存钱1万次 def add():global mon ...
- python线程池阻塞队列_福利又来啦!python多线程进阶篇
使用Python中的线程模块,能够同时运行程序的不同部分,并简化设计.如果你已经入门Python,并且想用线程来提升程序运行速度的话,希望这篇教程会对你有所帮助. 通过阅读本文,你将了解到:什么是死锁 ...
- python - 线程
python之路--线程 简介 操作系统线程理论 线程概念的引入背景 线程的特点 进程和线程的关系 使用线程的实际场景 用户级线程和内核级线程(了解) 线程和python 理论知识 线程的创建Thre ...
- Python线程同步机制: Locks, RLocks, Semaphores, Condition
为什么80%的码农都做不了架构师?>>> 翻译自Laurent Luce的博客 原文名称:Python threads synchronization: Locks, RLoc ...
最新文章
- 曝光!十万开发者喜爱的顶级当红讲师
- leetcode算法第四题
- mysql tomocat vs2005_C# 制作Java +Mysql+Tomcat 环境安装程序,一键式安装
- Google搜索引擎的十大应用
- 小记:再谈单例模式静态类区别优势
- 2018-2019-2 《Java程序设计》第6周学习总结
- 这才是程序员加班的真正原因!
- Codeforces 923 B. Producing Snow
- 使用LBP+SVM,训练识别给定的测试图像
- MQTT 控制报文 - PUBLISH发布消息,PUBACK,PUBREC,PUBREL,PUBCOMP - 第6章
- sqlserverv中处理字符串包含、截取
- 《系统工程师实战培训》-01-规划(附:原版课件)
- C++ vector 类学习笔记(转)
- 集体智慧编程-源代码
- 微软雅黑与等宽字体Source Code Pro下载
- Python整数求和
- 连接游戏服务器网络延迟高,玩游戏网络延迟高怎么办 网络卡Ping值很高的解决方法...
- 爱情树代码python_送男朋友礼物送什么比较有意义?
- python手机自动化测试脚本语言_python脚本语言? Appium移动自动化测试
- scrum认证费用_如何获得专业Scrum大师的认证-快速和慢速方式