几个事实

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, 因为每个子线程的超时开始时刻是上一个子线程超时结束的时刻。

测试代码

import threading,time

def 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等待线程结束_python线程join相关推荐

  1. python结束线程类_Python线程指南(转)

    1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样).但是当线程需要共享数据时,可能存在 ...

  2. c++ 等待子线程结束_python主线程与子线程的结束顺序

    对于程序来说,如果主进程在子进程还未结束时就已经退出,那么Linux内核会将子进程的父进程ID改为1(也就是init进程),当子进程结束后会由init进程来回收该子进程. 主线程退出后子线程的状态依赖 ...

  3. python的线程如何启用和结束_python线程进程

    操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入 输出设备组成的复杂系统,每位程序员不可能掌握所有系统实现的细节 ...

  4. python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...

    GIL锁 ​ 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...

  5. python 判断线程状态_Python线程指南

    Python线程指南 本文介绍了Python对于线程的支持,包括"学会"多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例. 注意:本文基于Python2. ...

  6. python 线程同步_Python 线程同步

    zhoushixiong Python 线程同步 以下代码可以直观展示加锁和不加锁时,对数据修改情况. 加锁时 # -*-* encoding:UTF-8 -*- # author : shoushi ...

  7. python线程状态_Python线程

    1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样).但是当线程需要共享数据时,可能存在 ...

  8. python 线程退出_python线程退出

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 如果某线程并未使用很多 io 操作, 它会在自己的时间片内一直占用处理器(和 g ...

  9. python 判断线程状态_Python 线程和进程

    前言 学编程,谁没有为线程折腾过啊. 目录 线程与进程 线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程. 操作系统会为这些进程分配一些执行资源,例如内存空间等. 在进程中, ...

最新文章

  1. 计算机主机电池,为什么电脑主机板上面有电池?很多人可能根本不知道
  2. mysql5.5开启binlog_MySQL开启binlog方法
  3. 微信公众平台开发之微信access_token如何有效长期保存
  4. linux windows爆音,升级Windows 10后 部分情况下有爆音,杂音,音频卡顿现象
  5. how can a model method trigger binding value refreshed
  6. flutter usb串口_Flutter 调试方式
  7. 将SQL Server数据库备份到多个文件或从多个文件还原
  8. 浅析托管与非托管C++代码(转)
  9. Potentiometers
  10. BZOJ 1673 [Usaco2005 Dec]Scales 天平:dfs 启发式搜索 A*搜索
  11. 关于zlog库的快速使用教程
  12. 2020牛客暑期多校训练营(第九场)I .The Crime-solving Plan of Groundhog
  13. Share Your Music - HTML5 Music Web App
  14. Java Excel导出动态自定义单元格样式
  15. Java8里不得不说的那些常用日期处理,码起来~
  16. JavaScript匿名函数和闭包
  17. 如何debug没有源代码的class文件—eclipse+jad
  18. java 获取文件夹下所有文件
  19. 惠普服务器开机系统密码,惠普(hp)各型号打印机冷复位,清零,回复出厂设置方法 以及 服务菜单(service menu)密码...
  20. excel 工具的使用---导入txt数据

热门文章

  1. thymeleaf比较符号问题
  2. webvie使用--官方api
  3. 开启spring boot学习之旅
  4. Flume的Source
  5. Hystrix是如何工作的
  6. 洛谷P2181 对角线(组合数)
  7. 阿里云服务器报 Liunx异常文件下载处理办法
  8. Innobackupx工具命令简单解析
  9. iOS开发隐藏tabBar的问题
  10. Linux下SHELL的PS1变量简介