上下文管理器和異步I/O

目錄

一、上下文管理器

1.1 定義

1.2 特點

1.3 適用場景

1.4 具體實現

1.5 具體實例

1.5.1 文件管理器

1.5.2 線程鎖釋放資源

二、異步I/O

2.1 定義

2.2 特點

2.3 實現方式

2.4 適用場景?

高并發網絡服務:Web服務器、API服務等需要處理大量并發連接

2.5 具體實現

2.6?await關鍵字

三、總結


一、上下文管理器

1.1 定義

上下文管理器(Context Manager)是Python中一種特殊對象,它實現了enter和exit方法,用于在with語句中進行資源管理。它確保在進入和退出代碼塊時執行特定的初始化和清理操作。
具體實現enter和exit方法的方法:

class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
self.file.close()
# 使用
with FileManager('example.txt', 'r') as f:
content = f.read()

從具體的實現方式來看,上下文管理器是一種支持 with 語句的對象,用于管理資源(如文件、網絡連接等)的獲取和釋放。

1.2 特點

  • 自動資源管理:通過with語句使用,確保資源正確分配和釋放
  • 異常安全:即使在執行過程中發生異常,也能確保清理代碼被執行
  • 簡潔語法:使用with語句簡化代碼,提高可讀性
  • 明確的生命周期:明確定義了進入和退出代碼塊時的行為

1.3 適用場景

  1. 文件操作(自動打開和關閉文件)
  2. 數據庫連接管理
  3. 鎖定和解鎖資源
  4. 臨時狀態更改(如臨時改變工作目錄)

1.4 具體實現

上面通過enter和exit方法實現只是一種,也能夠通過yield在函數中實現

from contextlib import contextmanager@contextmanager
def my_context_manager(message):print(f"Entering context: {message}")try:# yield 之前的代碼相當于 __enter__yield messagefinally:# yield 之后的代碼相當于 __exit__print(f"Exiting context: {message}")# 使用示例
with my_context_manager("test") as msg:print(f"Inside context with message: {msg}")

1.5 具體實例

1.5.1 文件管理器

class FileManager:def __init__(self, filename, mode):self.filename = filenameself.mode = modeself.file = Nonedef __enter__(self):print(f"Opening file: {self.filename}")self.file = open(self.filename, self.mode)return self.filedef __exit__(self, exc_type, exc_value, traceback):print(f"Closing file: {self.filename}")if self.file:self.file.close()# 處理異常if exc_type is not None:print(f"Exception occurred: {exc_value}")return False  # 不抑制異常# 使用示例
with FileManager("test.txt", "w") as f:f.write("Hello, World!")

1.5.2 線程鎖釋放資源

import threading
# 創建?個鎖對象,?于在多線程中同步對共享資源的訪問
lock = threading.Lock()# 定義線程函數,該函數將計數器增加n次
def thread_function(n):global counterfor _ in range(n):# 打印當前線程將計數器增加到的值print(f'線程 {threading.current_thread().name} 將計數器增加到 {counter}')# 獲取鎖,確保同?時間只有?個線程在修改counterlock.acquire()try:# 嘗試增加計數器counter += 1finally:# 釋放鎖,允許其他線程進?操作lock.release()# 初始化全局計數器
counter = 0
# 初始化線程列表
threads = []# 創建并啟動5個線程,每個線程都會執?thread_function
for i in range(5):# 創建線程t = threading.Thread(target=thread_function, args=(i,))# 將線程添加到線程列表中threads.append(t)# 啟動線程t.start()# 等待所有線程完成執?for t in threads:t.join()
# 打印最終的計數器值
print(f'最終的計數器值: {counter}')

二、異步I/O

2.1 定義

異步 I/O(Asynchronous I/O)指發起 I/O 操作后不必等待其完成,內核在后臺把數據準備好或寫入完成后,再通過回調、事件通知或 Future 等機制通知用戶程序;整個過程不會阻塞調用線程,線程可立即轉去執行其他任務,從而用極少的線程支撐海量并發。

2.2 特點

  • 非阻塞:調用立即返回,線程不掛起

  • 事件驅動:完成通知通過回調、Future、epoll、kqueue、IOCP 等事件機制觸發。

  • 高吞吐、低延遲:單線程即可管理成千上萬個并發連接,節省上下文切換和內存開銷。

  • 編程模型復雜:需要處理回調地獄、狀態機、錯誤傳播、背壓等問題;現代語言用 Promise/Future/協程/actor 封裝。

2.3 實現方式

1.async/await語法:Python 3.5+引入的關鍵字,用于定義協程函數
2.asyncio庫:Python標準庫,提供事件循環、協程、任務等核心功能
3.第三方庫支持:如aiohttp(HTTP客戶端/服務端)、aiomysql(MySQL數據庫)等
?

2.4 適用場景?

  • 高并發網絡服務:Web服務器、API服務等需要處理大量并發連接

  • I/O密集型應用:文件操作、數據庫查詢、網絡請求等耗時操作
  • 實時數據處理:實時消息處理、流數據處理等
  • 爬蟲應用:需要同時發起多個網絡請求的爬蟲程序


2.5 具體實現

基礎異步函數:

import asyncio
import timeasync def say_after(delay, what):await asyncio.sleep(delay)print(what)async def main():print(f"started at {time.strftime('%X')}")await say_after(1, 'hello')await say_after(2, 'world')print(f"finished at {time.strftime('%X')}")# 運行異步函數
asyncio.run(main())

2.6?await關鍵字

Pythonasync/await的工作原理

1. async 關鍵字用于定義一個協程函數,調用協程函數不會立即執行,而是返回一個協程對象

2. await 關鍵字用于暫停協程的執行,等待另一個協程完成并獲取其結果

3. Python的異步IO基于事件循環(Event Loop),事件循環負責調度協程的執行

4. 當遇到 await 表達式時,協程會暫時讓出控制權給事件循環,事件循環會去執行其他可執行的協程

5. 當被等待的操作完成后,事件循環會通知原協程繼續執行

代碼解釋:

import asyncioasync def say_after(delay, what):await asyncio.sleep(delay)  # 暫停執行delay秒print(what)async def main():print('開始')await say_after(1, 'hello')  # 等待1秒后打印helloawait say_after(2, 'world')  # 再等待2秒后打印worldprint('結束')# 運行主協程
asyncio.run(main())

在上述代碼中,當執行到await asyncio.sleep(delay)時,協程會暫停執行并將控制權交還給事件循環,事件循環可以去執行其他任務。當指定的時間過去后,協程會從暫停的地方繼續執行

三、總結

特性上下文管理器異步I/O
主要目的資源管理并發執行
核心概念enter/exitasync/await
執行模型同步阻塞異步非阻塞
資源管理確保資源正確初始化和清理高效處理大量I/O操作
異常處理在__exit__中處理通過try/except或任務異常處理
性能特點確保資源安全提高并發性能
典型應用文件操作、數據庫連接網絡請求、Web服務器

上下文管理器和異步I/O是Python中兩種重要的編程機制,它們解決不同層面的問題:
????????上下文管理器專注于資源管理,確保程序的健壯性和安全性
????????異步I/O專注于提高程序的并發性能,特別是在I/O密集型場景中


兩者可以獨立使用,也可以結合使用,共同構建高效、安全的Python應用程序。在現代Python開發中,理解并合理運用這兩種機制對編寫高質量代碼至關重要。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922356.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922356.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922356.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LabVIEW信號監測與分析

借助 LabVIEW 平臺,生成含正弦波與噪聲的信號,經頻譜分析等處理,結合動態限值判斷信號是否超限,廣泛用于音頻、振動等領域的信號監測,助力高效開展信號分析與質量把控。概念說明系統圍繞信號的生成、處理、分析及監測展…

MySQL數據庫與表的創建、修改及數據操作指南

精選專欄鏈接 🔗 MySQL技術筆記專欄Redis技術筆記專欄大模型搭建專欄Python學習筆記專欄深度學習算法專欄 歡迎訂閱,點贊+關注,每日精進1%,與百萬開發者共攀技術珠峰 更多內容持續更新中!希望能給大家帶來…

?new species of flying reptile1 discovered in Scotland?

Pterosaur: new species of flying reptile1 discovered in Scotland 蘇格蘭斯凱島發現新翼龍物種 考古學家們在蘇格蘭斯凱島發現了一個新的翼龍物種。這種獨特的飛行爬行動物生活在1.68 – 1.66億年前。 This flying reptile soared over the heads of dinosaurs2 when Scotla…

03 節點行為

審批流程圖如下圖,在此流程圖中,存在兩個UserTask節點,第一個節點是主管審批,第二個節點是產品經理審批,兩個節點中間有一個排他網關,此網關用來對主管審批的結果進行判斷,如果主管審批通過&…

深度卷積生成對抗網絡詳解與實現

深度卷積生成對抗網絡詳解與實現 0. 前言 1. 網絡架構 1.1 批歸一化 1.2 激活 1.3 上采樣 2. 構建 DCGAN 2.1 生成器 2.2 判別器 2.3 訓練 DCGAN 0. 前言 深度卷積生成對抗網絡 (Deep Convolutional Generative Adversarial Network, DCGAN) 是基于生成對抗網絡 (Generative A…

CF607B Zuma -提高+/省選-

CF607B Zuma codeforces 原鏈接 題目描述 Genos\texttt{Genos}Genos 最近在他的手機上下載了祖瑪游戲。在祖瑪游戲里,存在 nnn 個一行的寶石,第 iii 個寶石的顏色是 CiC_iCi?。這個游戲的目標是盡快的消滅一行中所有的寶石。 在一秒鐘,Ge…

拆分了解HashMap的數據結構

文章目錄 前言 一、底層數據結構總覽 二、核心組成部分詳解 1. 數組(哈希表) 2. 節點(Node) 3. 紅黑樹(TreeNode) 三、哈希函數與索引計算 四、哈希沖突的解決 五、擴容機制 六、關鍵特性與注意事…

關于電腦連接不到5g的WiFi時的一些解決辦法

方法一、設備管理器重卸載驅動后,重裝驅動。方法二、打開控制面板 “控制面板\網絡和 Internet\網絡連接” (親測有效)點擊更改適配器配置右擊當前的WLAN屬性點擊配置選擇“高級” 802.11a/b/g 無線模式選項欄 值:6.的雙…

Mathtype公式批量編號一鍵設置公式居中編號右對齊

插件[ygtools] 批量編號一鍵設置公式居中編號右對齊 單欄/多欄均可https://wwon.lanzout.com/i0NRf35vyw8j 下載密碼8543

基于ssm的小橘子出行客戶體驗評價系統[SSM]-計算機畢業設計源碼+LW文檔

摘要:隨著出行行業的快速發展,客戶體驗評價對于出行服務質量的提升至關重要。本文設計并實現了基于SSM(Spring Spring MVC MyBatis)框架的小橘子出行客戶體驗評價系統。該系統涵蓋系統用戶管理、司機信息管理、客戶評價管理等功…

算法日記---二分查找

目錄 前言 一、二分查找 1.思想 2.簡單二分 3.優點 4.局限性 二、模板 1.基本模板 2.簡單例題(LeetCode) 4.有重復元素的二分 5.0-1問題 總結 前言 本文通過講解簡單的二分查找配合leetcode例題對二分查找本質、模板進行了基礎的總結 提示&a…

Level Set(水平集)算法——形象化講解

目錄 維度一:核心思想與比喻(它像什么?) 維度二:要解決什么問題?(它能干嘛?有什么用?) 維度三:工作原理(它是怎么做到的&#xff1…

DDoS 攻防“軍備競賽”的幕后

談到 DDoS(分布式拒絕服務攻擊),很多人會想到“黑客租用肉雞發流量,網站直接崩”。但事實上,如今的 DDoS 攻防早已變成一場 軍備競賽。攻擊者的武器越來越“工業化”:僵尸網絡商品化:黑市上&…

如何用 Rust 重寫 SQLite 數據庫(二):是否有市場空間?

用 Rust 實現一個類似 SQLite 的嵌入式數據庫非常有意義,但需要結合具體目標和場景來評估其價值。以下從技術、生態、市場需求和個人成長等多個維度展開分析,并給出結論。一、技術價值:Rust 與數據庫的天然契合 SQLite 作為全球裝機量最大的數…

【Web】ImaginaryCTF 2025 wp

目錄 imaginary-notes certificate codenames-1 passwordless pearl imaginary-notes I made a new note taking app using Supabase! Its so secure, I put my flag as the password to the "admin" account. I even put my anonymous key somewhere in the si…

oracel如何找到外鍵子表

要找到導致外鍵約束沖突的子表(即包含"child record"的表),可以通過以下SQL查詢在Oracle數據庫中定位:1. 查詢約束基本信息(確定父表和子表)SELECT owner, constraint_name, table_name AS child…

智源研究院新研究:突破物理世界智能邊界的RoboBrain 2.0,將重構具身AI能力天花板

當你對著家用機器人說"把杯子放在筆筒和鍵盤之間,對齊杯身logo"時,它能精準理解空間關系并執行動作;當多臺機器人在超市協作補貨時,它們能自主規劃軌跡、避免沖突并完成長周期任務——這些曾經出現在科幻電影中的場景&a…

【2025】Office核心組件Microsoft word,Excel,PowerPoint詳細使用指南

Office 核心組件使用指南 Microsoft Word 文字處理 Word主要用于創建和編輯文檔,如信件、報告、論文等。 2025Office🔗 1. 界面認識 快速訪問工具欄:位于左上角,可自定義保存、撤銷、恢復等常用命令。功能區:頂部…

【模型訓練篇】VeRL的使用 - RL(PPO)與源碼

繼續學習字節家的VeRL,今天來看看VeRL的RL,是VeRL系列的第三篇文章(話說近期好多大事兒,我司發布了Longcat、韓立結嬰、阿里周五發布了QWen-Next都是好東西啊,學不過來了damn) 底層分布式能力基礎Ray&…

QML Charts組件之折線圖的鼠標交互

目錄前言相關系列代碼示例詳解(LineSeriesDemo3.qml)功能概覽運行效果代碼說明工程下載參考前言 接上文(QML Charts組件之折線圖的基礎屬性),本文將重點介紹LineSeries的鼠標交互,包括:鼠標拖拽…