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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python字符串比较大小[通俗易懂]

    python字符串比较大小[通俗易懂]理解原理和相关知识字符串按位比较,两个字符串第一位字符的ascii码谁大,字符串就大,不再比较后面的;第一个字符相同就比第二个字符串,以此类推,需要注意的是空格的ascii码是32,空(null)的ascii码是0https://zhidao.baidu.com/question/558202137825309252.htmlord函数接受一个字符print(max([‘1’,’…

    2022年6月18日
  • python-修改目录下带有特定字符的所有文件内容,文件名字,目录名字

    python-修改目录下带有特定字符的所有文件内容,文件名字,目录名字

    2021年5月18日
  • 考研-数据库_数据库系统考研看什么书

    考研-数据库_数据库系统考研看什么书文章目录前言一、数据库的概念二、综合知识前言一、数据库的概念1、数据数据:描述事物的符号记录称为数据。特点:数据和关于数据的解释不可分。2、数据库长期存储在计算机内、有组织、可共享的大量的数据的集合。数据库中的数据按照一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。特点:永久存储、有组织、可共享。3、数据库系统(DBS)(DateBaseSystem)数据库系统,指在计算机系统中引入数据库后的系统,一般由数据库、数据

    2022年10月30日
  • 产品分享:Qt视频播放器(不依赖系统编解码),当前版本v1.1.2

    产品分享:Qt视频播放器(不依赖系统编解码),当前版本v1.1.2欢迎技术交流和帮助,提供IT相关服务,索要源码请联系博主QQ:21497936,若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936本文章博客地址:https://blog.csdn.net/qq21497936/article/details/100180789目录前言Qt自带播放器框架存在问题Demov1.1…

    2022年5月8日
  • Property &#39;sqlSessionFactory&#39; or &#39;sqlSessionTemplate&#39; are required

    Property &#39;sqlSessionFactory&#39; or &#39;sqlSessionTemplate&#39; are required

    2022年1月14日
  • 基于朴素贝叶斯的文本分类算法「建议收藏」

    基于朴素贝叶斯的文本分类算法「建议收藏」基于朴素贝叶斯的文本分类算法摘要:常用的文本分类方法有支持向量机、K-近邻算法和朴素贝叶斯。其中朴素贝叶斯具有容易实现,运行速度快的特点,被广泛使用。本文详细介绍了朴素贝叶斯的基本原理,讨论多项式模型(MM),实现了可运行的代码,并进行了一些数据测试。关键字:朴素贝叶斯;文本分类第1章贝叶斯原理1.1贝叶斯公式[1]已知某条件概率,如何得到两个事件交换后的概率,也就…

    2022年5月17日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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