几个事实

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相关推荐

  1. Python线程join和setDaemon

    看一下线程的setDaemon()方法 import time import threading import ctypes import inspectdef sayHello():for i in ...

  2. python线程join方法_Python多线程join()用法

    Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: 知识点一:主进程结束,子进程继续执行 当一个进程启动之后,会默认产生一个主线程,因为线程是程 ...

  3. python线程join方法

    前言: join方法的作用是同步线程. 1.不使用join方法: 当设置多个线程时,在一般情况下(无守护线程,setDeamon=False),多个线程同时启动,主线程执行完,会等待其他子线程执行完, ...

  4. python等待线程结束_python线程join

    几个事实 1 python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样 2 如果创建线程,并且设置了daemon为true,即thread.se ...

  5. python3 线程池源码解析_5分钟看懂系列:Python 线程池原理及实现

    概述 传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器 ...

  6. python 线程锁 共享全局变量 线程通信

    python 线程锁 共享全局变量 线程通信 注意:全局变量不必做为参数传到函数里!!! import threading # 银行存钱和取钱 # 存钱1万次 def add():global mon ...

  7. python线程池阻塞队列_福利又来啦!python多线程进阶篇

    使用Python中的线程模块,能够同时运行程序的不同部分,并简化设计.如果你已经入门Python,并且想用线程来提升程序运行速度的话,希望这篇教程会对你有所帮助. 通过阅读本文,你将了解到:什么是死锁 ...

  8. python - 线程

    python之路--线程 简介 操作系统线程理论 线程概念的引入背景 线程的特点 进程和线程的关系 使用线程的实际场景 用户级线程和内核级线程(了解) 线程和python 理论知识 线程的创建Thre ...

  9. Python线程同步机制: Locks, RLocks, Semaphores, Condition

    为什么80%的码农都做不了架构师?>>>    翻译自Laurent Luce的博客 原文名称:Python threads synchronization: Locks, RLoc ...

最新文章

  1. 曝光!十万开发者喜爱的顶级当红讲师
  2. leetcode算法第四题
  3. mysql tomocat vs2005_C# 制作Java +Mysql+Tomcat 环境安装程序,一键式安装
  4. Google搜索引擎的十大应用
  5. 小记:再谈单例模式静态类区别优势
  6. 2018-2019-2 《Java程序设计》第6周学习总结
  7. 这才是程序员加班的真正原因!
  8. Codeforces 923 B. Producing Snow
  9. 使用LBP+SVM,训练识别给定的测试图像
  10. MQTT 控制报文 - PUBLISH发布消息,PUBACK,PUBREC,PUBREL,PUBCOMP - 第6章
  11. sqlserverv中处理字符串包含、截取
  12. 《系统工程师实战培训》-01-规划(附:原版课件)
  13. C++ vector 类学习笔记(转)
  14. 集体智慧编程-源代码
  15. 微软雅黑与等宽字体Source Code Pro下载
  16. Python整数求和
  17. 连接游戏服务器网络延迟高,玩游戏网络延迟高怎么办 网络卡Ping值很高的解决方法...
  18. 爱情树代码python_送男朋友礼物送什么比较有意义?
  19. python手机自动化测试脚本语言_python脚本语言? Appium移动自动化测试
  20. scrum认证费用_如何获得专业Scrum大师的认证-快速和慢速方式

热门文章

  1. Linux防火墙设置-DNS服务器篇
  2. Open Source: 开源软件许可的选择
  3. 解决Windows下Arm下Linux下Qt4程序的中文乱码问题
  4. 使用VSIUAL C#.NET操作Excel -把DataTable中的数据写入Excel
  5. SubSonic数据库操作
  6. 使用 ASP.NET 配置类
  7. java pdf添加透明水印_如何在PDF文件中添加透明水印
  8. 【实用】MB52库存报表转网格格式
  9. 23、Power Query-XML与JSON数据获取
  10. 提高项目执行力的六板斧