join详解

看到代码示例时,都会出现一个join,这个作用如何?先看结论

  1. 阻塞主程序,专注于执行多线程中的程序

  2. 多线程多join的情况下,依次执行各线程的join方法,子线程全部结束了才能执行主线程。

  3. join无入参,则等待到该执行绪结束,才开始执行下一个线程的join。

  4. 入参timeout为线程的阻塞时间,如timeout=2 就是按照着这个线程2s 以后,就不管他了,继续执行下面的程序。

观察下面的代码,

import threading, timedef worker(interval):print("worker start at "+time.strftime('%H:%M:%S'))time.sleep(interval)print('finish worker, ',time.strftime('%H:%M:%S'))def master(interval):print("master start at "+time.strftime('%H:%M:%S'))time.sleep(interval)print('finish master, ', time.strftime('%H:%M:%S'))if __name__ == '__main__':ts = []t1 = threading.Thread(target=worker, args=(3,))t2 = threading.Thread(target=master, args=(5,))ts.append(t1)ts.append(t2)t2.start()t1.start()print('End main thread, '+time.strftime('%H:%M:%S'))

代码里没有join时,上述有起了三个线程,分别是main,t1,t2,他们会各自同时并发执行各自的代码

master start at 16:29:08
worker start at 16:29:08
End main thread, 16:29:08
finish worker,  16:29:11
finish master,  16:29:13

如果我们加上join,原本各自为政的三个线程,就有了秩序

import threading, timedef worker(interval):print("worker start at "+time.strftime('%H:%M:%S'))time.sleep(interval)print('finish worker, ',time.strftime('%H:%M:%S'))
def master(interval):print("master start at "+time.strftime('%H:%M:%S'))time.sleep(interval)print('finish master, ', time.strftime('%H:%M:%S'))if __name__ == '__main__':ts = []t1 = threading.Thread(target=worker, args=(3,))t2 = threading.Thread(target=master, args=(5,))ts.append(t1)ts.append(t2)t2.start()t1.start()for thread in ts:thread.join()print('End main thread, '+time.strftime('%H:%M:%S'))
master start at 16:32:43
worker start at 16:32:43
finish worker,  16:32:46
finish master,  16:32:48
End main thread, 16:32:48

main线程只有当所有子线程完成后才能执行,StackOverflow里有段很好的总结:

If, for example, you want to concurrently download a bunch of pages to concatenate them into a single large page, you may start concurrent downloads using threads, but need to wait until the last page/thread is finished before you start assembling a single page out of many. That’s when you use join().

那如果join()里带了参数呢?此时的子线程表示主线程你只要最多等我多长时间,你就可以自便了,这里参数改为join(2):

master start at 16:35:42
worker start at 16:35:42
finish worker,  16:35:45
End main thread, 16:35:46
finish master,  16:35:47

可以看到main线程等了4秒,就管自己执行后续的代码了,而main最后才完成自己的程序,这里为何是四秒?因为两个线程分别都告诉了主线程等他2秒,总共4秒,你也可以拆开,让每个线程join不同的时间
Python 多執行緒 thread join() 的作用

python 线程thread详解相关推荐

  1. Java核心(一)线程Thread详解

    一.概述 在开始学习Thread之前,我们先来了解一下 线程和进程之间的关系: 线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位. 线程不能够独立执行,必须依存在应用程序中,由应用程 ...

  2. python time模块详解

    python time模块详解 转自:http://blog.csdn.net/kiki113/article/details/4033017 python 的内嵌time模板翻译及说明    一.简 ...

  3. python嗅探工具详解附源码(使用socket,带tkinter界面)

    python嗅探工具详解(带tkinter界面) 点击详见原理 点击详见原理 TCP/IP协议号补充 必备基础知识 IP数据包格式 详见点此 TCP报文格式 详见点此 struct模块 在Python ...

  4. Python开发技术详解

    Python开发技术详解 下载地址 https://pan.baidu.com/s/1KTrk3B1sajMiPIoo3-Rhuw 扫码下面二维码关注公众号回复 100089获取分享码 本书目录结构如 ...

  5. java闭合数据_java多线程中线程封闭详解

    线程封闭的概念 访问共享变量时,通常要使用同步,所以避免使用同步的方法就是减少共享数据的使用,这种技术就是线程封闭. 实现线程封闭的方法 1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的 ...

  6. Java线程池详解学习:ThreadPoolExecutor

    Java线程池详解学习:ThreadPoolExecutor Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) - zhangpeterx的博客 在源码的目录java/util/ ...

  7. Java 线程池详解学习:FixedThreadPool,CachedThreadPool,ScheduledThreadPool...

    Java常用的线程池有FixedThreadPool和CachedThreadPool,我们可以通过查看他们的源码来进行学习. Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) ...

  8. Java多线程之线程池详解

    Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...

  9. Java 线程池详解及实例代码

    转载自  Java 线程池详解及实例代码 这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时 ...

最新文章

  1. 超级 App 手机百度云端架构设计与个性化推荐
  2. Spring-----projects-----概述
  3. 快速理解Docker - 容器级虚拟化解决方案
  4. mysql 单表查询
  5. HTML中禁用表单控件的两种方法readonly与disabled
  6. Google Volley框架源码走读
  7. Flink SQL 实战:HBase 的结合应用
  8. Linux搭建SVN服务器
  9. 可以写在简历上的22个轻松上手的Java经典项目教程(含源码and笔记)
  10. Linux驱动开发: USB驱动开发
  11. 我的世界java材质包推荐下载_我的世界材质包排行-Minecraft材质包-我的世界高清材质包下载大全-Minecraft中文分享站...
  12. 关于JFreeChart中BarChart柱体宽度设置的问题纪要
  13. java高并发解决方案
  14. ode45的常用和扩展用法
  15. 纺织品GRSlogo使用标准 GRS认证的详情概括
  16. c语言文件尾没有newline字符,关于C++:”文件末尾无新行”编译器警告“No newline at end of file”...
  17. 等差数列java_java简单的编程(等差数列)
  18. Blood Type Diet
  19. amcharts动态生成数据
  20. 软件工程导论张海蕃书籍pdf_《软件工程导论》张海蕃课后习题答案

热门文章

  1. TensorFlow2 -官方教程 :保存和恢复模型
  2. windows7安装打印机提示“本地打印后台处理程序服务没有运行”
  3. 分析Android引起的“电视智能化”之TV用UI的现状与未来
  4. 不在同一局域网的两台电脑如何通过ssh连接
  5. android studio安装apk时,vivo 部分手机出现 解析软件包错误
  6. set -x 与 set +x
  7. 【CSS面试题】—CSS实现三角形
  8. python批量添加qq好友_python实现QQ批量登录功能
  9. JVM内存模型以及JVM内存模型图
  10. 什么是硬件加密与软件加密,有什么区别?