多線程編程中的條件變量及其優化

本套課在線學習視頻(網盤地址,保存到網盤即可免費觀看):

鏈接: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.pswp.cn/web/44646.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44646.shtml
英文地址,請注明出處:http://en.pswp.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…