Python asyncio 非同步編程指南:高效處理 I/O 密集型任務

Python asyncio 非同步編程指南:高效處理 I/O 密集型任務

更新於 發佈於 閱讀時間約 5 分鐘

簡介

asyncio 是 Python 中用於編寫非同步代碼的標準庫,用於實現非步程式設計(asynchronous programming)。它允許你編寫高效的 I/O 密集型應用程序,例如網絡爬蟲、Web 服務器、即時通訊系統等。通過使用 asyncio,你可以避免傳統同步編程中的阻塞問題,從而提升程序的性能。

同步 vs 非同步

同步編程

在同步編程中,代碼是有順序執行的。當一個任務需要等待 I/O 操作(例如網絡請求或文件讀寫)時,整個程序會被阻塞,直到該操作完成。

import time

def sync_task():
print("開始任務")
time.sleep(2) # 模擬 I/O 操作
print("任務完成")

sync_task()

非同步編程

在非同步編程中,當一個任務需要等待 I/O 操作時,程序會切換到其他任務,從而避免阻塞。這使得程序能夠更高效地利用資源。

import asyncio

async def async_task():
print("開始任務")
await asyncio.sleep(2) # 模擬 I/O 操作
print("任務完成")

asyncio.run(async_task())

await 的作用

async 函數內部,await 用於等待異步操作完成。例如,await asyncio.sleep(2) 讓程式暫停 2秒,但不會阻塞其他異步任務。

建立多個非同步任務

我們可以使用 asyncio.create_task() 來同時執行多個異步任務

import asyncio

async def task(name, seconds):
print(f"{name} 開始")
await asyncio.sleep(seconds)
print(f"{name} 完成")

async def main():
task1 = asyncio.create_task(task("任務1", 2))
task2 = asyncio.create_task(task("任務2", 1))

await task1
await task2

asyncio.run(main())

asyncio.create_task()的作用

是對協程的進一步封裝,它允許你並發地執行多個協程。可以使用 asyncio.create_task() 來創建任務。

輸出結果:

raw-image

可以看到,任務 2 比任務 1 早完成,但它們是同時開始的,這就是異步執行的效果。

asyncio.gather() 併發執行多個任務

如果我們想一次執行多個異步函數並等待所有結果,可以使用 asyncio.gather()

import asyncio

async def fetch_data(name, seconds):
await asyncio.sleep(seconds)
return f"{name} 數據獲取完成"

async def main():
results = await asyncio.gather(
fetch_data("API 1", 2),
fetch_data("API 2", 1),
fetch_data("API 3", 3)
)
print(results)

asyncio.run(main())
raw-image

asyncio.gather() vs asyncio.create_task()

  • asyncio.create_task() 創建的任務是獨立執行的,不能直接返回結果。
  • asyncio.gather() 用於並行執行多個異步函數,並收集返回值。

總結

asyncio 是 Python 標準庫中強大的非同步工具,能夠顯著提升 I/O 密集型應用的性能。本篇文章介紹了:

  • asyncio 的基礎概念與優勢
  • await 的作用
  • asyncio.create_task() 來並發執行多個任務
  • asyncio.gather() 來同時執行並獲取結果

透過這些技巧,你可以更有效率地開發高性能的 Python 應用程式。如果你有任何問題或建議,歡迎在下方留言討論。



avatar-img
小猴工程師
1會員
21內容數
留言
avatar-img
留言分享你的想法!
小猴工程師 的其他內容
這篇文章介紹如何使用 CCXT 這個強大的 Python 套件來存取加密貨幣交易所的數據。文章涵蓋安裝、基本使用方法、取得市場數據、取得交易對列表、取得歷史 K 線數據以及 WebSocket 即時數據等功能,並以 Binance 作為範例示範。
正確的 Kubernetes 叢集開關機流程和節點維護,是確保叢集穩定運行的關鍵。本文詳細介紹啟動、關閉 Kubernetes 叢集的步驟,以及使用 cordon、drain 和 uncordon 命令進行節點維護的最佳實踐,並提供開關機順序建議,最大限度地減少對應用程序的影響。
Kubernetes 是一個強大的容器編排工具,本文將介紹其核心概念、實際操作步驟和常見問題解決方案,並提供進階學習方向,幫助讀者快速入門 Kubernetes。
本文比較現貨交易和合約交易,以幣安交易所為例,詳細解釋現貨交易的操作流程,並說明兩種交易方式的區別、優缺點及風險,幫助讀者選擇適合自己的交易策略。
隨著大數據與人工智慧的興起,SMC(聰明資金概念)成為金融市場中一種新的交易策略。該策略著重於觀察和分析市場中的機構資金流向,藉此找出價格的關鍵轉折點。本文探討了SMC的基本理念、應用步驟及其優缺點,並提供實戰範例,幫助交易者提升市場判斷能力與交易準確性。
在金融市場中,套利是一種常見且吸引人的投資策略。套利的核心在於利用不同市場或金融工具間的價格差異,實現低風險或無風險的利潤。 套利策略的基本概念 套利(Arbitrage)指的是在不同市場或金融工具間發現並利用價格不一致的機會。例如,假設某支股票在紐約證券交易所(NYSE)的價格是50美元,而在
這篇文章介紹如何使用 CCXT 這個強大的 Python 套件來存取加密貨幣交易所的數據。文章涵蓋安裝、基本使用方法、取得市場數據、取得交易對列表、取得歷史 K 線數據以及 WebSocket 即時數據等功能,並以 Binance 作為範例示範。
正確的 Kubernetes 叢集開關機流程和節點維護,是確保叢集穩定運行的關鍵。本文詳細介紹啟動、關閉 Kubernetes 叢集的步驟,以及使用 cordon、drain 和 uncordon 命令進行節點維護的最佳實踐,並提供開關機順序建議,最大限度地減少對應用程序的影響。
Kubernetes 是一個強大的容器編排工具,本文將介紹其核心概念、實際操作步驟和常見問題解決方案,並提供進階學習方向,幫助讀者快速入門 Kubernetes。
本文比較現貨交易和合約交易,以幣安交易所為例,詳細解釋現貨交易的操作流程,並說明兩種交易方式的區別、優缺點及風險,幫助讀者選擇適合自己的交易策略。
隨著大數據與人工智慧的興起,SMC(聰明資金概念)成為金融市場中一種新的交易策略。該策略著重於觀察和分析市場中的機構資金流向,藉此找出價格的關鍵轉折點。本文探討了SMC的基本理念、應用步驟及其優缺點,並提供實戰範例,幫助交易者提升市場判斷能力與交易準確性。
在金融市場中,套利是一種常見且吸引人的投資策略。套利的核心在於利用不同市場或金融工具間的價格差異,實現低風險或無風險的利潤。 套利策略的基本概念 套利(Arbitrage)指的是在不同市場或金融工具間發現並利用價格不一致的機會。例如,假設某支股票在紐約證券交易所(NYSE)的價格是50美元,而在
本篇參與的主題活動
這幾天看到有落淚挑戰所以就來分享一下從小到大落淚的原因
▉不是世界太糟,是你忘了自己 「你的不開心, 很多時候不是世界太糟糕, 而是因為你總是把自己放在最後。」 這句話一語道破了許多人疲憊與失落的根源。 我們總是在意他人感受、扮演好每一個角色, 卻忘了自己也是人生故事裡
各位愛美的女孩們!隨著天氣漸暖,是不是也開始想換上輕盈飄逸的裙裝了呢?說到裙裝界的百搭常青樹,「長裙」絕對榜上有名!它不僅能完美修飾身形、隱藏在意的小缺點,更能輕鬆駕馭各種風格,無論是溫柔仙氣、休閒率性、知性優雅,還是個性潮流,一條對的長裙就能讓你輕鬆變身!
這幾天看到有落淚挑戰所以就來分享一下從小到大落淚的原因
▉不是世界太糟,是你忘了自己 「你的不開心, 很多時候不是世界太糟糕, 而是因為你總是把自己放在最後。」 這句話一語道破了許多人疲憊與失落的根源。 我們總是在意他人感受、扮演好每一個角色, 卻忘了自己也是人生故事裡
各位愛美的女孩們!隨著天氣漸暖,是不是也開始想換上輕盈飄逸的裙裝了呢?說到裙裝界的百搭常青樹,「長裙」絕對榜上有名!它不僅能完美修飾身形、隱藏在意的小缺點,更能輕鬆駕馭各種風格,無論是溫柔仙氣、休閒率性、知性優雅,還是個性潮流,一條對的長裙就能讓你輕鬆變身!