Python多线程与多线程中join()的用法

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

大家好,又见面了,我是你们的朋友全栈君。

Python多线程与多进程中join()方法的效果是相同的。

下面仅以多线程为例:

首先需要明确几个概念:

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

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

知识点三:
此时join的作用就凸显出来了,join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程在终止,例子见下面三。

知识点四:
join有一个timeout参数:

  1. 当设置守护线程时,含义是主线程对于子线程等待timeout的时间将会杀死该子线程,最后退出程序。所以说,如果有10个子线程,全部的等待时间就是每个timeout的累加和。简单的来说,就是给每个子线程一个timeout的时间,让他去执行,时间一到,不管任务有没有完成,直接杀死。
  2. 没有设置守护线程时,主线程将会等待timeout的累加和这样的一段时间,时间一到,主线程结束,但是并没有杀死子线程,子线程依然可以继续执行,直到子线程全部结束,程序退出。

一:Python多线程的默认情况

import threading
import time

def run():
    time.sleep(2)
    print('当前线程的名字是: ', threading.current_thread().name)
    time.sleep(2)


if __name__ == '__main__':

    start_time = time.time()

    print('这是主线程:', threading.current_thread().name)
    thread_list = []
    for i in range(5):
        t = threading.Thread(target=run)
        thread_list.append(t)

    for t in thread_list:
        t.start()

    print('主线程结束!' , threading.current_thread().name)
    print('一共用时:', time.time()-start_time)

  

其执行结果如下
<span role="heading" aria-level="2">Python多线程与多线程中join()的用法

关键点:

  1. 我们的计时是对主线程计时,主线程结束,计时随之结束,打印出主线程的用时。
  2. 主线程的任务完成之后,主线程随之结束,子线程继续执行自己的任务,直到全部的子线程的任务全部结束,程序结束。

二:设置守护线程

import threading
import time

def run():

    time.sleep(2)
    print('当前线程的名字是: ', threading.current_thread().name)
    time.sleep(2)


if __name__ == '__main__':

    start_time = time.time()

    print('这是主线程:', threading.current_thread().name)
    thread_list = []
    for i in range(5):
        t = threading.Thread(target=run)
        thread_list.append(t)

    for t in thread_list:
        t.setDaemon(True)
        t.start()

    print('主线程结束了!' , threading.current_thread().name)
    print('一共用时:', time.time()-start_time)

  

其执行结果如下,注意请确保setDaemon()在start()之前。
<span role="heading" aria-level="2">Python多线程与多线程中join()的用法

关键点:

  1. 非常明显的看到,主线程结束以后,子线程还没有来得及执行,整个程序就退出了。

三:join的作用

import threading
import time

def run():

    time.sleep(2)
    print('当前线程的名字是: ', threading.current_thread().name)
    time.sleep(2)


if __name__ == '__main__':

    start_time = time.time()

    print('这是主线程:', threading.current_thread().name)
    thread_list = []
    for i in range(5):
        t = threading.Thread(target=run)
        thread_list.append(t)

    for t in thread_list:
        t.setDaemon(True)
        t.start()

    for t in thread_list:
        t.join()

    print('主线程结束了!' , threading.current_thread().name)
    print('一共用时:', time.time()-start_time)

  

其执行结果如下:
<span role="heading" aria-level="2">Python多线程与多线程中join()的用法

关键点:

    1. 可以看到,主线程一直等待全部的子线程结束之后,主线程自身才结束,程序退出。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155875.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • QQ机器人制作教程_qq群机器人如何编写

    QQ机器人制作教程_qq群机器人如何编写目录前期准备1、机器人框架的下载和配置2、python的配置和安装具体实现1、发送信息2、获取群成员列表3、接收上报的事件4、实现简单的自动回复下一篇文章介绍更多功能前期准备1、机器人框架的下载和配置首先需要一个qq机器人框架,我使用的是基于mirai以及MiraiGo开发的go-cqhttp(里面有开发文档)。框架下载地址Windows下32位文件为go-cqhttp-v*-windows-386.zipWindows下64位文件为go-cqhttp-v*-windows-amd6

  • java异或运算符号_java异或运算符使用场景

    java异或运算符号_java异或运算符使用场景异或运算符“^”是异或运算符,异或的规则是转换成二进制比较,相同为0,不同为1.异或运算符可认为是无进位的二进制相加,如:6^7如6二进制为:00000110如7二进制为:00000111则6^7=1异或运算符性质(1)0^N=N;N^N=0(2)满足交换律及结合律简单的算法题(1)如果一个数组中只有一个数出现了奇数次,剩下的数都出现了偶数次,求这个出现了奇数次的数。publicstaticvoidgetData(int[]arr){int

  • java打印出菱形图案_输入以下图案菱形

    java打印出菱形图案_输入以下图案菱形利用for循环打印出菱形图案

  • 茂名高端碳项目什么时候完建_茂名石化对茂名的影响

    茂名高端碳项目什么时候完建_茂名石化对茂名的影响去年茂南区新引进1000万元以上项目26个,协议投资金额91.15亿元,其中茂南石化园区2020年产值突破百亿大关。近日,茂南区集中开工了5个重大项目,总投资19.8亿元,年度计划投资1.6亿元,涉及石油化工、环保能源、仓储物流、现代农业等多个领域。茂南区第一季度重大工程集中开工的5个项目包括,茂名天源石化有限公司建设的碳三碳四资源利用项目投资总额达18亿元,还有总投资6100万元的茂名市炳昊环境科技有限公司年处理处置5万吨废矿物油等含油废物综合利用绿色环保建设项目,另外总投资6000万元的茂名市德旺农

  • Java 正则表达式的用法和实例

    Java 正则表达式的用法和实例一、概述:用来描述或者匹配一系列符合某个语句规则的字符串二、单个符号1、英文句点”.”符号:匹配单个任意字符。表达式”t.o“可以匹配:tno,t#o,teo等等。不可以匹配:tnno,to,Tno,t正o等。2、中括号”[]“:只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。表达式:t[abcd]n只可以匹配:tan,tbn,tcn,tdn。不可以匹配:th…

  • [GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及

    [GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及作为网络安全初学者,会遇到采用Go语言开发的恶意样本。因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识;另一方面是分享与读者,希望大家一起进步。这系列文章入门部分将参考“尚硅谷”韩顺平老师的视频和书籍《GO高级编程》,详见参考文献,并结合作者多年的编程经验进行学习和丰富,且看且珍惜吧!后续会结合网络安全进行GO语言实战深入,驾驭~这些年我学过各种编程语言,从最早的C语言到C++,再到C#、PHP、JAVA,再到IOS开发、Python,到最新的GO语言,学得是真的杂。有时

    2022年10月10日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号