langShiftlangShift

Python 異步編程

從 JavaScript 開發者視角學習 Python 的異步編程、事件循環機制和異步 Web 開發

1. 引言

為什麼需要異步編程?

作為 JavaScript 開發者,你已經熟悉了 Promise、async/await 和事件循環的概念。Python 也有自己的異步編程模型,雖然語法相似,但底層機制有所不同。

異步編程的核心價值

  • 提高程序性能:避免阻塞 I/O 操作
  • 更好的資源利用:單線程處理多個併發任務
  • 響應性:保持程序的響應能力
  • 可擴展性:支持大量併發連接

💡 學習策略:將 Python 的異步編程視為 JavaScript 異步模型的"Python 版本"

2. 同步 vs 異步

2.1 基本概念對比

正在載入編輯器...

2.2 事件循環機制

正在載入編輯器...

3. Python 異步編程基礎

3.1 async/await 語法

Python 的 async/await 語法與 JavaScript 非常相似,但有一些重要的差異。

正在載入編輯器...

3.2 併發執行

Python 提供了多種方式來實現併發執行,類似於 JavaScript 的 Promise.all()。

正在載入編輯器...

3.3 異步上下文管理器

Python 的異步上下文管理器類似於 JavaScript 的 try-with-resources 模式。

正在載入編輯器...

3.4 常見陷阱:異步函數中的阻塞代碼

在異步函數中,絕對不能調用阻塞(同步)的 I/O 操作,否則會阻塞整個事件循環,導致所有併發任務停滯。

錯誤示例

import time
import requests # 同步 HTTP 庫
async def bad_async_function():
# ❌ 錯誤:這會阻塞整個事件循環!
time.sleep(5)
# ❌ 錯誤:這也會阻塞!
requests.get("https://example.com")

正確做法

import asyncio
import httpx # 異步 HTTP 庫
async def good_async_function():
# ✅ 正確:非阻塞等待
await asyncio.sleep(5)
# ✅ 正確:使用異步庫
async with httpx.AsyncClient() as client:
await client.get("https://example.com")

3.5 運行異步程序

在不同的環境中,運行異步代碼的方式略有不同。

1. 標準 Python 腳本 使用 asyncio.run() 作為入口點。

import asyncio
async def main():
print("Hello")
await asyncio.sleep(1)
print("World")
if __name__ == "__main__":
# 自動創建並管理事件循環
asyncio.run(main())

2. Jupyter Notebook / Pyodide (本教程環境) 這些環境通常已經有一個正在運行的事件循環,因此不能使用 asyncio.run()

  • 直接 await async_function() (如果在支持頂層 await 的環境中)
  • 或者 asyncio.create_task(async_function()) (後臺運行)

4. 異步 Web 開發

4.1 FastAPI 基礎

FastAPI 是 Python 的現代異步 Web 框架,類似於 JavaScript 的 Express.js。

正在載入編輯器...

4.2 異步數據庫操作

正在載入編輯器...

5. 異步迭代和生成器

5.1 異步迭代器

正在載入編輯器...

5.2 異步上下文管理器與迭代器結合

正在載入編輯器...

6. 實際項目示例

6.1 異步 Web 爬蟲

正在載入編輯器...

6.2 異步任務隊列

正在載入編輯器...

7. 練習題

練習 1:異步數據處理

正在載入編輯器...

練習 2:異步 API 客戶端

正在載入編輯器...

8. 總結與擴展學習路徑

Python 的異步編程能力,雖然起步稍晚,但如今已經非常成熟,適用於 I/O 密集型場景、Web 後端、爬蟲、實時數據處理等領域。通過本教程,你已經完成了從基礎語法到實際項目的全面掌握。

學習回顧

理解了 Python 中 async/await 的使用方式及其與 JavaScript 的異同

熟悉了事件循環、併發執行、異步生成器、上下文管理器等高級特性

結合 FastAPI 與 asyncpg 實現了完整的異步 Web 服務與數據庫交互

編寫了爬蟲、任務隊列、API 客戶端等實用異步項目示例

練習了真實場景下的數據處理流程

推薦擴展

以下是下一步深入異步編程的學習建議:

📚 框架與庫

FastAPI:深入使用依賴注入、後臺任務、中間件等功能

aiohttp:構建異步 HTTP 客戶端和服務端

Starlette:FastAPI 的底層異步框架,可實現更低層級的異步 Web 服務

Trio / Curio:另類異步庫,提供結構化併發的編程範式

🛠️ 工具與調試

asyncio.TaskGroup (Python 3.11+):更安全的併發執行模型

aiomonitor / aiodebug:調試異步事件循環

pytest-asyncio:編寫異步測試用例

💡 實踐項目建議

實現一個 異步微服務架構,通過消息隊列連接多個異步服務

構建一個 基於 WebSocket 的實時聊天室

編寫一個 異步數據聚合器,整合多個 API 的異步響應

🧠 思考題:相比傳統多線程,多進程編程,異步編程有哪些優勢和限制?你會在哪些實際項目中優先選擇異步方案?

🎉 到這裡,你已經完成了 Python 異步編程的全景入門。如果你是來自 JavaScript 的背景,相信現在你對 Python 的異步世界已經不再陌生。繼續深入探索,異步將成為你開發效率的重要武器!