python 多线程编程(线程同步和守护线程)

news2024/10/3 4:32:05

守护线程: 随着主线程的终止而终止,不管当前主线程下有多少子线程没有执行完毕,都会终止。
线程同步: join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程再终止。
参考连接:守护线程和线程同步
下面探究加线程同步和守护线程的情况:

  1. 情况:各个子线程阻塞,确保线程同步,主线程等子线程运行完毕才执行
  2. 情况:各个子线程不阻塞,子线程并行,主线程等子线程运行完毕才执行
  3. 情况:各个子线程不阻塞,不确保线程同步,子线程并行,主线程不等子线程结束,子线程还在执行
  4. 情况:主线程执行完了,子线程不管有没有执行完,都要结束。

情况1:各个子线程阻塞,确保线程同步,主线程等子线程运行完毕才执行

# coding:utf-8
import time
import random
import threading
lists = ['python', 'django', 'tornado','flask', 'bs5', 'requests', 'uvloop']
new_lists = []
def work():
    t1= time.time()
    if len(lists) == 0:
        return
    data = random.choice(lists)
    lists.remove(data)
    new_data = '%s_new' % data
    new_lists.append(new_data)
    time.sleep(1)
    t2= time.time()
    print("线程名称{},时间{}".format(t.name, t2-t1))

if __name__ == '__main__':
    # 主线程
    start = time.time()
    t_list = []
    for i in range(len(lists)):
        t = threading.Thread(target=work)
        t_list.append(t)
    t1 = time.time()
    for t in t_list:
        t.start()
        # 等待上一个子线程运行结束后再进行下一个线程,所有子线程结束才执行主线程
        t.join()
        print("当前启动线程名称{},数量{},是否存活{}".format(t.name, threading.active_count(), t.is_alive()))
    t2 = time.time()
    print("主线程分配线程的时间{}".format(t2-t1))
    print('old list:', lists)
    print('new list:', new_lists)
    print('time is %s' % (time.time() - start))
    print('主线程退出')

在这里插入图片描述

情况2:子线程并行,主线程等子线程运行完毕才执行

    for i in range(len(lists)):
        t = threading.Thread(target=work)
        # 子线程之间并行
        t.start()
        t_list.append(t)
    t1 = time.time()
    for t in t_list:
        # 确保所有子线程运行完,主线程才退出
        t.join()
        print("当前启动线程名称{},数量{},是否存活{}".format(t.name, threading.active_count(), t.is_alive()))

在这里插入图片描述

情况3:子线程并行,主线程不等子线程结束,子线程还在执行

若去掉t.join(),各个线程一起运行,主线程也不等待,结果如下:

    for i in range(len(lists)):
        t = threading.Thread(target=work)
        # 子线程之间并行
        t.start()
        t_list.append(t)
        print("当前启动线程名称{},数量{},是否存活{}".format(t.name, threading.active_count(), t.is_alive()))    

情况3

创建的线程是与需要的参数相关,想当于创建了7个线程,去同时执行,且在没有加锁的状态下,但这种方式,处理线程并发数与参数有关,且并发量过高。
下面使用线程池,使得线程数量与参数无关

if __name__ == '__main__':
    # 主线程
    start = time.time()
    # 创建 ThreadPoolExecutor 
    with ThreadPoolExecutor(2) as executor: 
        # 提交任务
        future_list = [executor.submit(work) for i in range(len(lists))]
    for future in as_completed(future_list):
        result = future.result() # 获取任务结果
        print("%s get result : %s" % (threading.current_thread().name, result))
    print('old list:', lists)
    print('new list:', new_lists)
    print('new_list len', len(new_lists))
    print('time is %s' % (time.time() - start))
    print('主线程退出')

在这里插入图片描述

情况4:主线程执行完了,子线程不管有没有执行完,都要结束。

    for i in range(len(lists)):
        t = threading.Thread(target=work)
        # # 启动前,先设置守护线程
        t.setDaemon(True)  
        t.start()
        t_list.append(t)
        print("当前启动线程名称{},数量{},是否存活{}".format(t.name, threading.active_count(), t.is_alive()))

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入了解tomcat线程池

1.概述 在正式进入Tomcat线程池之前,小伙伴们可以先回顾一下JDK中的线程池相关特性,对于JDK线程池的总结和源码的解析感兴趣的童鞋,也可参考博主的层层剖析线程池源码的这篇文章,文章主要讲述对线程池的生命周期,核心参…

Vue3 - 不再支持 IE11,到底为什么?

前言 咱们的 Vue2 目前仍然支持 IE11,但是到了 Vue3 这里,直接被抛弃了。 IE 浏览器可以说是早期前端开发的噩梦,现在还充斥的大量兼容 IE 浏览器的代码,你可以在网上看到很多类似的信息。 IE 浏览器下 float 布局错乱。IE 浏览器…

商务呈现之沟通管理-上

一、前言 课程目标及适用人群课程目标:商务/项目的目标达成,任务推动,良好的商务呈现 现实的困扰我们商务活动中是否有遇到以下情况: (1)需求老是变 理解不一致细节不清晰(2)CR很难谈 需求基线不清晰没有利用好"交换"(3)原地打转 事项推进缓慢几个月还在讨…

相似度系列-6:单维度方法:Evaluating Coherence in Dialogue Systems using Entailment

Evaluating Coherence in Dialogue Systems using Entailment coherence 英文中意味着连贯性、条理性。 这篇文章是面向对话应用的,更加关注于对话中上下位的连贯性。1. 直接转换为 NLI问题,premise-hypothesis问题。——2. 数据集是自己构造的。——数…

一文带你了解【抽象类和接口】

1. 抽象类概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是并不是所有类都是用来描绘对象的。如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 举个简单的例子 上图中,三角形&#xff0…

构建一个商业智能 BI 分析平台,公司CIO应该重点关注什么?

企业级商业智能 BI 分析平台的构建是一个系统型的工程,涉及业务分析需求的把控、各类数据资源的整合清洗、数据仓库的架构设计、可视化分析报表逻辑设计、IT 部门与业务部门的工作边界划分与配合等等居多环节。 每一个环节的重要性都不容忽视,第一是业务…

(算法设计与分析)第三章动态规划-第二节:动态规划之背包类型问题

文章目录一:01背包问题(1)题目描述(2)解题思路(3)完整代码二:分割等和子集(01背包变形)(1)题目描述(2)解题思路…

Java:Jar包反编译,解压和压缩

1、简述 JAR 文件就是 Java Archive ( Java 档案文件),它是 Java 的一种文档格式。 JAR 文件非常类似 ZIP 文件。准确的说,它就是 ZIP 文件,所以叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中&a…

蓝桥杯必备算法分享——差分算法

AcWing—差分算法 文章目录AcWing---差分算法一、什么是差分?二、差分的作用三、一维差分模板四、二维差分五、二维差分构造方法图示:六、二维差分矩阵模板总结差分算法是前缀和算法的逆运算。两者可以对比着学习: 一、什么是差分&#xff1…

旭日图超越了传统的饼图和圆环图,能表达清晰的多层级和归属关系

“旭日图是什么?用来干什么?” “没听说过旭日图......” “旭日图不就是多层饼图嘛......” 鉴于很多人对旭日图都不太了解,那今天我们就用平台的旭日图为大家讲解。旭日图看似低调简单,却一点都不简单! 旭日图由多…

关于pool.apply_async的学习【参数问题】

一、学习 参考:(1条消息) python pool.apply_async调用 参数为dataset的函数 不执行问题解决_嗯嗲和滴的博客-CSDN博客_pool.apply_async参数 一个参数的情况 一定要加逗号 在只有一个参数要传时 需要写成列表/元组的形式: task_fun.apply_async(args[v…

从零开始学前端:垃圾回收机制,闭包,案例 --- 今天你学习了吗?(JS:Day11)

从零开始学前端:程序猿小白也可以完全掌握!—今天你学习了吗?(JS) 复习:从零开始学前端:作用域、执行顺序 — 今天你学习了吗?(JS:Day10) 文章目…

网络编程——封装和分用(图解)

一、什么是封装 💌💌💌网络编程中的封装,并不是Java面向对象思想里的封装,继承,多态的封装.它是应用程序通过TCP协议传送数据时,每一次进行包装送入网络中,像极了发快递时的你. 思考…

FFplay文档解读-51-多媒体资源

33. 多媒体资源 以下是当前可用多媒体源的说明。 33.1 amovie 这与电影源相同,但默认情况下会选择音频流。 33.2 movie 从电影容器中读取音频和/或视频流。 它接受以下参数: filename要读取的资源的名称(不一定是文件;它也可以是通过某…

[附源码]java毕业设计基于web的健康信息管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Oracle Primavera Unifier文档管理器(Document Manager)

目录 引言 介绍 引言 在 Oracle Primavera Unifier 中,文档管理器维护项目的所有文件和文档。每个项目/外壳都包含自己的文档管理器,另一个文档管理器驻留在公司级别。管理员确保员工和项目/shell 成员始终使用最新版本的文档,并使访问和分…

热成像仪在LED产品的应用

热成像仪对LED产品的检测 LED产品检测 LED作为取代传统照明工具(如白炽灯、卤素灯等)的新型光源,但其散热效果严重影响LED的实际使用寿命,散热工艺成为LED应用和发展的关键因素,红外热像仪可以进行LED温度检测,帮助验证散热工艺。…

如何对珍贵水生物标本提供三维重建,数字化技术助力长江大保护...

近日,由武汉白鱀豚保护基金会发起的“看见长江的美好”系列长江大保护行动中,英特尔 Evo X BMW i 打造了“移动数字探索工作室”,携手【云端地球】团队来到了拥有百年生命印记的地方,这里收藏着包括白鲟、白鱀豚、中华鲟、长江江豚…

密码在智能汽车数据安全领域的应用研究报告

开放隐私计算 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播,愿成为中国 “隐私计算最后一公里的服务区”。 177篇原创内容 …

HTTP状态码301和302的区别

简介 在HTTP状态码中,3XX表示重定向,指网页发生了转移,重定向到目标地址中。 301:表示永久性转移 (Permanently Moved) 302:表示临时性转移(Temporarily Moved) 说明…