多线程编程中的条件变量及其优化

本套课在线学习视频(网盘地址,保存到网盘即可免费观看):

链接:https://pan.quark.cn/s/7220b198cf00

在多线程编程中,条件变量是一种用于线程间通信和同步的机制。通过使用条件变量,可以有效地协调线程间的关系,优化资源利用,并减少线程在CPU资源上的不必要占用。本文将通过Python示例代码,详细介绍如何在多线程环境中使用条件变量。

00:00 - 多线程编程中的条件变量及其优化

使用条件变量优化线程间的协调与资源利用

条件变量允许线程在某个条件不满足时进入等待状态,并在条件满足时被唤醒。这样可以避免线程空闲时对CPU资源的占用,并提高程序性能。

import threading
import time# 共享资源
shared_data = []
lock = threading.Lock()
condition = threading.Condition(lock)class Producer(threading.Thread):def __init__(self, name):super().__init__()self.name = namedef run(self):global shared_datawhile True:with condition:shared_data.append(f"Data from {self.name}")print(f"{self.name} produced data")condition.notify_all()  # 通知所有等待的消费者time.sleep(1)class Consumer(threading.Thread):def __init__(self, name):super().__init__()self.name = namedef run(self):global shared_datawhile True:with condition:while not shared_data:print(f"{self.name} is waiting")condition.wait()  # 等待生产者通知data = shared_data.pop(0)print(f"{self.name} consumed {data}")time.sleep(1)# 创建生产者和消费者线程
producers = [Producer(f"Producer-{i}") for i in range(2)]
consumers = [Consumer(f"Consumer-{i}") for i in range(3)]# 启动线程
for producer in producers:producer.start()
for consumer in consumers:consumer.start()# 等待线程结束(这里实际上是无限循环,所以不会结束)
for producer in producers:producer.join()
for consumer in consumers:consumer.join()

02:02 - 条件变量实现生产者-消费者模型

通过引入条件变量,优化了生产者-消费者模型,使得程序在资源不足时能够进入等待状态,并在资源可用时被唤醒继续执行。这种优化方式提高了程序的性能,特别是在资源闲置状态下能够及时释放锁,避免了不必要的阻塞。

import threading
import time
import random# 共享资源
buffer = []
buffer_size = 5
lock = threading.Lock()
condition = threading.Condition(lock)class Producer(threading.Thread):def __init__(self, name):super().__init__()self.name = namedef run(self):global bufferwhile True:with condition:while len(buffer) >= buffer_size:print(f"{self.name} is waiting due to full buffer")condition.wait()  # 等待消费者消费item = f"Item from {self.name}"buffer.append(item)print(f"{self.name} produced {item}")condition.notify_all()  # 通知所有等待的消费者time.sleep(random.random())class Consumer(threading.Thread):def __init__(self, name):super().__init__()self.name = namedef run(self):global bufferwhile True:with condition:while not buffer:print(f"{self.name} is waiting due to empty buffer")condition.wait()  # 等待生产者生产item = buffer.pop(0)print(f"{self.name} consumed {item}")condition.notify_all()  # 通知所有等待的生产者time.sleep(random.random())# 创建生产者和消费者线程
producers = [Producer(f"Producer-{i}") for i in range(2)]
consumers = [Consumer(f"Consumer-{i}") for i in range(3)]# 启动线程
for producer in producers:producer.start()
for consumer in consumers:consumer.start()# 等待线程结束(这里实际上是无限循环,所以不会结束)
for producer in producers:producer.join()
for consumer in consumers:consumer.join()

通过这些示例代码,您可以更好地理解如何在Python中使用条件变量来优化多线程编程,特别是在生产者-消费者模型中,条件变量能够显著提高程序的性能和资源利用率。

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

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

相关文章

Prometheus + alermanager + webhook-dingtalk 告警

添加钉钉机器人 1. 部署 alermanager 1.1 下载软件包 wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz 网址 :Releases prometheus/alertmanager (github.com) 1.2 解压软件包 mkdir -pv …

医日健集团技术力量体现测试的背后

医日健集团覆盖式更新 科技日新月异的时代,医日健集团始终走在行业的前列。近日,医日健集团外勤技术人员全面对市场点位投放的数智药房进行了新系统升级和机器测试,这是医日健对于科技创新的最新尝试。 以客户体验为核心优化新体验 医日健集团…

NCNN源码学习(1):Mat详解

前言:最原始的发行版本代码比较简洁,我们从2017年ncnn第一次开源的版本阅读mat的源码。阅读源码味如嚼蜡,下面就开始吧! 目录 构造函数 内存分配 数据成员 申请和释放内存 引用计数 辅助函数 填充函数fill 参考 构造函数 ncnn提供了8种构造函数的方式。 // emptyM…

Js 前置,后置补零的原生方法与补字符串 padStart及padEnd

在工作中,遇到了需要将不满八位的一个字符串进行后补0的操作,所以就在网上学习了关于js原生补充字符串的方法,然后用这篇博客记录下来。 目录 前置补充字符串 String.prototype.padStart() 后置补充字符串String.prototype.padEnd() 前置补…

将独热码应用到神经网络中

引言 接上回,本文继续说如何用TensorFlow将独热编码应用到一个简单的神经网络中,以实现从一段随机文本到另一段随机文本的转换。 步骤一:导入库 import tensorflow as tf import numpy as np import random import string步骤二&#xff1…

【超音速 专利 CN117710683A】基于分类模型的轻量级工业图像关键点检测方法

申请号CN202311601629.7公开号(公开)CN117710683A申请日2023.11.27申请人(公开)超音速人工智能科技股份有限公司发明人(公开)张俊峰(总); 杨培文(总); 沈俊羽; 张小村 技术领域 本发明涉及图像关键点检测…

数据库MySQL下载安装

MySQL下载安装地址如下: MySQL :: Download MySQL Community Server 1、下载界面 2、点击下载 3、解压记住目录 4、配置my.ini文件 未完..

C语言课程回顾:九、C语言之预处理命令

9 预处理命令 9 预处理命令9.1 概述9.2 宏定义9.2.1 无参宏定义9.2.2 带参宏定义 9.3 文件包含9.4 条件编译9.5 本章小结9.6 扩展 10种软件滤波方法的示例程序1、限副滤波2、中位值滤波法3、算术平均滤波法4、递推平均滤波法(又称滑动平均滤波法)5、中位…

Vue.js学习笔记(五)抽奖组件封装——转盘抽奖

基于VUE2转盘组件的开发 文章目录 基于VUE2转盘组件的开发前言一、开发步骤1.组件布局2.布局样式3.数据准备 二、最后效果总结 前言 因为之前的转盘功能是图片做的,每次活动更新都要重做UI和前端,为了解决这一问题进行动态配置转盘组件开发,…

【jvm】字符串常量池问题

目录 一、基本概念1.1 说明1.2 特点 二、存放位置2.1 JDK1.6及以前2.2 JDK1.72.3 JDK1.8及以后 三、工作原理3.1 创建字符串常量3.2 使用new关键字创建字符串 四、intern()方法4.1 作用 五、优点六、字节码分析6.1 示例16.1.1 代码示例6.1.2 字节码6.1.3 解析 6.2 示例26.2.1 代…

STM32智能仓储管理系统教程

目录 引言环境准备晶智能仓储管理系统基础代码实现:实现智能仓储管理系统 4.1 数据采集模块 4.2 数据处理与决策模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:仓储管理与优化问题解决方案与优化收尾与总结 1. 引言 智能仓储管理系统…

7 月12日学习打卡--栈和队列的相互转换

hello大家好呀,本博客目的在于记录暑假学习打卡,后续会整理成一个专栏,主要打算在暑假学习完数据结构,因此会发一些相关的数据结构实现的博客和一些刷的题,个人学习使用,也希望大家多多支持,有不…

什么是STM32?嵌入式和STM32简单介绍

1、嵌入式和STM32 1.1.什么是嵌入式 除了桌面PC之外,所有的控制类设备都是嵌入式 嵌入式系统的定义:“用于控制、监视或者辅助操作机器和设备的装置”。 嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板,是一种专用的计算机系统。…

初阶数据结构速成

本篇文章算是对初阶数据结构的总结,内容较多,请耐心观看 基础概念部分 顺序表 线性表( linear list )是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的数据结构,常⻅的线性表:…

C语言 错题本

C语言 错题本 文章目录 C语言 错题本77月11号整数求逆--掌握 7月12号求符合给定条件的整数集水仙花数打印九九口诀表--掌握统计素数并求和--掌握 7月13号凑硬币前n项和(一加一减)最大公约数 7月14号正序整数分解 7月17号简单计算器 217月26号求符合给定条件的整数集水仙花数 旨…

【安全设备】上网行为管理

一、什么是上网行为管理 上网行为管理是对企业内部员工使用互联网行为的监视和管理,旨在规范网络使用者的上网行为,提高网络安全性,保护企业信息安全,同时提高员工的工作效率。上网行为管理通过对员工的上网行为进行监控、记录和…

机器学习——关于极大似然估计法的一些个人思考(通俗易懂极简版)

最近在回顾机器学习的一些相关理论知识,回顾到极大似然法时,对于极大似然法中的一些公式有些迷糊了,所以本文主要想记录并分享一下个人关于极大似然估计法的一些思考,如果有误,请见谅,欢迎一起前来探讨。当…

单元测试实施最佳方案(背景、实施、覆盖率统计)

1. 什么是单元测试? 对于很多开发人员来说,单元测试一定不陌生 单元测试是白盒测试的一种形式,它的目标是测试软件的最小单元——函数、方法或类。单元测试的主要目的是验证代码的正确性,以确保每个单元按照预期执行。单元测试通…

合肥高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

合肥高校大学智能制造实验室近日迎来了一项重要时刻,数字孪生可视化系统平台建设项目顺利通过了验收。这一项目的成功实施,不仅标志着合肥高校在智能制造领域取得新的突破,为我国智能制造技术的发展注入新活力。 合肥高校智能制造实验室作为…

T972 切换至pdm 声音输入的方法

1.在hardware/amlogic/audio/audio_hal/audio_hw.c下,直接切换 在 static unsigned int select_port_by_device(struct aml_audio_device *adev) 中先强制切换为pdm 2.在device mk 配置文件中 #add fof fix the mic bug by jason 20230621 PRODUCT_PROPERTY_OVE…