在 Python 的多线程编程中,经常碰到 thread.join()这样的代码。那么今天咱们用实际代码来解释一下 join 函数的作用。

一、
当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束,例子见下面。

# 测试多线程中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:20start join: 22:24:20
start waiting2: 22:24:20end join: 22:24:20stop waiting1: 22:24:23stop waiting2:  22:24:28

二、
当我们使用setDaemon(True)方法,设置子线程为守护线程时,主线程一旦执行结束,则全部线程全部被终止执行,可能出现的情况就是,子线程的任务还没有完全执行结束,就被迫停止,例子见下面。

# 测试多线程中join的功能
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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.setDaemon(True)
thread1.start()
tsk.append(thread1)
thread2 = threading.Thread(target = doWaiting1)
thread2.setDaemon(True)
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:34:46start waiting2: 22:34:46
start join: 22:34:46end join: 22:34:46

三、
没有设置守护线程且没有设置join函数的timeout参数时,主线程将会一直等待,直到子线程全部结束,主线程才结束,程序退出。

代码如下:

# 测试多线程中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"
for tt in tsk:tt.join()
print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

代码执行结果如下:

start waiting1: 22:41:50start join: 22:41:50
start waiting2: 22:41:50stop waiting1: 22:41:53stop waiting2:  22:41:58end join: 22:41:58

四、
当没有设置守护线程且join函数的参数timeout=2时,主线程将会等待多个子线程timeout的累加和这样的一段时间,时间一到,主线程结束,但是并没有杀死子线程,子线程依然可以继续执行,直到子线程全部结束,程序退出。

代码如下:

# 测试多线程中join的功能
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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"
for tt in tsk:tt.join(2)
print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

代码执行结果如下:

start waiting1: 23:02:34start waiting2: 23:02:34
start join: 23:02:34stop waiting1: 23:02:37end join: 23:02:38stop waiting2:  23:02:42

五、
当设置守护线程join函数的参数timeout=2时,主线程将会等待多个子线程timeout的累加和这样的一段时间,时间一到,主线程结束,杀死未执行完的子线程,程序退出。

代码如下:

# 测试多线程中join的功能
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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.setDaemon(True)
thread1.start()
tsk.append(thread1)
thread2 = threading.Thread(target = doWaiting1)
thread2.setDaemon(True)
thread2.start()
tsk.append(thread2)
print 'start join: ' + time.strftime('%H:%M:%S') + "\n"
for tt in tsk:tt.join(2)
print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

代码执行结果如下:

start waiting1: 23:23:57start waiting2: 23:23:57
start join: 23:23:57stop waiting1: 23:24:00end join: 23:24:01

【python教程】对多线程中join()的详细教程相关推荐

  1. python多线程中join()的理解

    在 Python 的多线程编程中,经常碰到 thread.join()这样的代码.那么今天咱们用实际代码来解释一下 join 函数的作用. 第一,当一个进程启动之后,会默认产生一个主线程,因为线程是程 ...

  2. python数据科学系列:pandas入门详细教程

    导读 前2篇分别系统性介绍了numpy和matplotlib的入门基本知识,今天本文自然是要对pandas进行入门详细介绍,通过本文你将系统性了解pandas为何会有数据分析界"瑞士军刀&q ...

  3. Python数据可视化之Plotnine库超详细教程系列

    Python数据可视化之Plotnine库超详细教程系列(一):概述 一.Plotnine库简介 ggplot2包奠定了R语言数据可视化在数据科学中的地位,数据可视化一直是Python的短板,即使有M ...

  4. VMware15中安装Linux详细教程

    VMware15中安装Linux详细教程 ======================== 一. 搭建VMware环境 1. 打开链接(https://www.vmware.com/cn.html), ...

  5. Adobe Photoshop修改中英文语言教程?ps中文版变为英文版详细教程

    Adobe Photoshop修改中英文语言教程?ps中文版变为英文版详细教程 有用户在使用Photoshop都会遇到需要更改软件语言的问题,例如动作插件,就要求在英文版本下的PS中使用,今天小编为大 ...

  6. JAVA多线程中join()方法的详细分析

    虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客给的例子看起来都像 ...

  7. python如何使用多线程_Python多线程与多线程中join()的用法

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

  8. python头像教程_微信好友头像全家福详细教程python版

    昨天按照大佬的代码,做了一个微信全家福的图片,后面好多人问我是怎么做的,索性我就出个详细的教程吧,我python也是三脚猫功夫,有不对的地方,还请各位大佬手下留情. 先看看成果吧 微信好友头像全家福详 ...

  9. 最详细的python案例学习与实践(含详细教程)

    为了学习Python,使用Python开发应用程序,手头必须有得力的工具.在笔者看来,Python和PyCharm是最基本的学习和开发工具.如果要成为教育家或作家型的Python程序员,那么还必须准备 ...

最新文章

  1. Java 程序员必备的 15 个框架,前 3 个地位无可动摇!
  2. 【BZOJ】1572: [Usaco2009 Open]工作安排Job
  3. JDK安装以及开发环境搭建
  4. 数据库开发基本操作-数据库基础知识
  5. bind9 安装:部署自建dns系统
  6. java http请求原理_浅谈Spring Cloud zuul http请求转发原理
  7. 《实现模式(修订版)》—第2章模式
  8. 华为机试HJ30:字符串合并处理
  9. 分享过滤条件中增加一个自定义过滤变量插件代码
  10. php 实用 函数,PHP实用函数9
  11. VMware Vsphere 虚拟化
  12. phonegap plugin.xml 示例
  13. 【Python】python帮助文档
  14. 最全常见算法工程师面试题目整理
  15. Outlook的服务器设置中POP3协议,在outlook的服务器设置中pop3协议是指什么
  16. 可能有用的篡改检测常识
  17. maxwell采集mysql binlog 日志数据到kafka topic
  18. 网易前端JavaScript编码规范
  19. excel表格多列数据中查找重复行数据
  20. xmind 文件 打开后会在当前目录生成 configuration,p2和workspace目录,artifacts.xml文件 解决

热门文章

  1. 如何利用vw+rem进行移动端布局
  2. 在参数上使用@Param(“paramName”)注解”解决了传多个参数的问题
  3. CALL TRANSACTION - bdc_options
  4. 【整理】ABAP快捷启动Debug三种方式
  5. 解除分配UNASSIGN
  6. 以无代码的方式将Form打印内容转成生成PDF文件
  7. ora 12541无监听程序
  8. Hybris 体系结构
  9. SAP修改登录桌面背景图片
  10. 采购订单检查/保存BADI使用