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

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

簡介

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
0會員
11內容數
留言
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美元,而在
本篇參與的主題活動
我的得力助手T小姐在短時間內經歷了2次流產。 第一次流產後沒幾個月又急著要懷上,其實我還蠻不能理解的,身體都還沒復原、還沒查清楚流產的原因又急著懷孕真的風險太大。第二次也是在6周左右又流產了,這次終於好好的去醫院檢查原因,然後讓身體休息了近一年才又懷孕。 但是我聽了他上次流產的原因,是染色體異常
這套牌組以帝牙盧卡ex為前期主力,阿爾宙斯ex為中後期核心,透過能量積累和場面控制,在中後期展現強大優勢。文章詳細介紹牌組配置、核心戰術思路、各核心寶可夢運用要點及對戰要點,適合想學習此套牌組的玩家參考。
她每天醒來就已經上班,睡著了也在待命。 這是一份無法請假、無法辭職、無法下班的工作。沒有週末,沒有年假,沒有病假。當孩子發高燒時,沒有其他同事可以替班;當她自己病倒時,工作依然等待著她。 我的太太說道:「今天是我成為母親的第205天,也是我第205天沒有完整睡過一個晚上。」 全職媽媽,是世界上
定期存款(簡稱定存)是許多人喜愛的理財方式之一,但圍繞它的細節問題卻不少。以下整理了十個常見疑問,並附上詳細解答,幫全面了解定存的運作方式。
愛美的女孩們都知道,選對眼影盤 & 修容盤,化妝真的可以事半功倍!今天要來開箱 Perfect Diary 完美日記動物眼影盤、珂慕美妝 10 色彩妝綜合盤,以及 Judydoll 橘朵高光修容盤,看看哪款最值得你的化妝包擁有!
我的得力助手T小姐在短時間內經歷了2次流產。 第一次流產後沒幾個月又急著要懷上,其實我還蠻不能理解的,身體都還沒復原、還沒查清楚流產的原因又急著懷孕真的風險太大。第二次也是在6周左右又流產了,這次終於好好的去醫院檢查原因,然後讓身體休息了近一年才又懷孕。 但是我聽了他上次流產的原因,是染色體異常
這套牌組以帝牙盧卡ex為前期主力,阿爾宙斯ex為中後期核心,透過能量積累和場面控制,在中後期展現強大優勢。文章詳細介紹牌組配置、核心戰術思路、各核心寶可夢運用要點及對戰要點,適合想學習此套牌組的玩家參考。
她每天醒來就已經上班,睡著了也在待命。 這是一份無法請假、無法辭職、無法下班的工作。沒有週末,沒有年假,沒有病假。當孩子發高燒時,沒有其他同事可以替班;當她自己病倒時,工作依然等待著她。 我的太太說道:「今天是我成為母親的第205天,也是我第205天沒有完整睡過一個晚上。」 全職媽媽,是世界上
定期存款(簡稱定存)是許多人喜愛的理財方式之一,但圍繞它的細節問題卻不少。以下整理了十個常見疑問,並附上詳細解答,幫全面了解定存的運作方式。
愛美的女孩們都知道,選對眼影盤 & 修容盤,化妝真的可以事半功倍!今天要來開箱 Perfect Diary 完美日記動物眼影盤、珂慕美妝 10 色彩妝綜合盤,以及 Judydoll 橘朵高光修容盤,看看哪款最值得你的化妝包擁有!
你可能也想看
Google News 追蹤
Thumbnail
分享一個有趣的套件,名為 await-to-js。 可以讓 Promise 與 await 的寫法更簡潔。
Thumbnail
更快、更短、更即時是串流傳輸必要的元素, 而我們常常在使用Python請求API時都是等待式回應, 也就是一個請求過去之後, 待對方處理完畢後再行回應, 但假設需要下載的檔案、內容非常大時, 是不是使用者只能傻傻的等待整個傳輸結束後才能顯示? 這樣的使用者體驗也實在太糟糕了, 對於使用者來說除了完全
※ 非同步概念總複習 為什麼要使用 Promise? 在 JavaScript 開發中,處理非同步操作是常見需求,涉及如文件讀寫、數據庫查詢或網路請求等耗時任務。傳統的回調方式可能導致代碼結構混亂,稱為「回調地獄」,難以維護和理解。 Promise 是解決這問題的方法。它是一個物件(objec
認識 async/await基本概念: async 的本質是 promise 的語法糖 ,只要 function 標記為 async,就表示裡頭可以撰寫 await 的同步語法,而 await 顧名思義就是「等待」,它會確保一個 promise 物件都解決 ( resolve ) 或出錯 ( re
※ 同步概念: 單純地「由上而下」執行程式碼,而且一次只執行一件事,也就是「按順序執行,一個動作結束才能切換到下一個」。缺點是你需要「等待」事情執行完畢,才能繼續往下走。 ※ 非同步概念: 盡可能讓主要的執行程序不需要停下來等待,若遇到要等待的事情,就發起一個「非同步處理」,讓主程序繼續執行,
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
非同步程式設計(Asynchronous programming) 或是簡單的稱之為 async,它是一種並發程式模型(concurrent programming model),其目的就是讓多個任務能同時在作業系統的執行緒上執行,並透過 async/.await 保留同步。
Thumbnail
為什麼需要非同步? 我們在「【Web微知識系列】 Web Workers」有介紹到在瀏覽器可執行腳本Javascript環境底下如何完成非同步的操作, 主要是為了讓任務更有效率的進行, 不會因為一個非常耗時的工作堵塞住整個服務, 導致無法服務他人的窘境。 大家應該經常在餐廳裡會看到服務員協
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
Thumbnail
分享一個有趣的套件,名為 await-to-js。 可以讓 Promise 與 await 的寫法更簡潔。
Thumbnail
更快、更短、更即時是串流傳輸必要的元素, 而我們常常在使用Python請求API時都是等待式回應, 也就是一個請求過去之後, 待對方處理完畢後再行回應, 但假設需要下載的檔案、內容非常大時, 是不是使用者只能傻傻的等待整個傳輸結束後才能顯示? 這樣的使用者體驗也實在太糟糕了, 對於使用者來說除了完全
※ 非同步概念總複習 為什麼要使用 Promise? 在 JavaScript 開發中,處理非同步操作是常見需求,涉及如文件讀寫、數據庫查詢或網路請求等耗時任務。傳統的回調方式可能導致代碼結構混亂,稱為「回調地獄」,難以維護和理解。 Promise 是解決這問題的方法。它是一個物件(objec
認識 async/await基本概念: async 的本質是 promise 的語法糖 ,只要 function 標記為 async,就表示裡頭可以撰寫 await 的同步語法,而 await 顧名思義就是「等待」,它會確保一個 promise 物件都解決 ( resolve ) 或出錯 ( re
※ 同步概念: 單純地「由上而下」執行程式碼,而且一次只執行一件事,也就是「按順序執行,一個動作結束才能切換到下一個」。缺點是你需要「等待」事情執行完畢,才能繼續往下走。 ※ 非同步概念: 盡可能讓主要的執行程序不需要停下來等待,若遇到要等待的事情,就發起一個「非同步處理」,讓主程序繼續執行,
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
非同步程式設計(Asynchronous programming) 或是簡單的稱之為 async,它是一種並發程式模型(concurrent programming model),其目的就是讓多個任務能同時在作業系統的執行緒上執行,並透過 async/.await 保留同步。
Thumbnail
為什麼需要非同步? 我們在「【Web微知識系列】 Web Workers」有介紹到在瀏覽器可執行腳本Javascript環境底下如何完成非同步的操作, 主要是為了讓任務更有效率的進行, 不會因為一個非常耗時的工作堵塞住整個服務, 導致無法服務他人的窘境。 大家應該經常在餐廳裡會看到服務員協
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp