示例代碼:
from motor.motor_asyncio import AsyncIOMotorClient
from pymongo import MongoClient
🔍 這兩個庫分別是:
名字 | 說明 | 舉個例子 |
---|---|---|
pymongo.MongoClient | 同步版 的 MongoDB 客戶端(常規阻塞式操作) | 你在主線程里一行一行地讀寫 Mongo,等上一步做完才能做下一步 |
motor.motor_asyncio.AsyncIOMotorClient | 異步版 的 MongoDB 客戶端(非阻塞協程) | 你可以用 await ,并發跑多個 Mongo 操作,適合高并發 Web 應用 |
? 區別
1. pymongo.MongoClient
(同步)
- 每一次數據庫操作都會阻塞代碼執行,等 MongoDB 返回結果之后,程序才繼續往下走。
- 適合腳本、命令行工具、Jupyter、低并發后端服務。
比喻:
像是你去銀行排隊,一個人辦完業務,下一個人才能開始。
2. motor.AsyncIOMotorClient
(異步)
- 每次數據庫操作是異步非阻塞的,你可以
await
數據返回,但其他任務可以同時干活。 - 適合 FastAPI、aiohttp 這類異步 Web 框架,可以顯著提升并發性能。
比喻:
像是網上辦業務,你遞交申請后不用等結果,先去干別的,等通知你再回來取。
🔢 舉個數值對比的例子:
假設你要對 MongoDB 讀取 1000 個用戶文檔。
使用 pymongo.MongoClient
(同步):
from pymongo import MongoClientclient = MongoClient()
db = client["mydb"]
users = db["users"]for i in range(1000):doc = users.find_one({"_id": i}) # 每次都等待數據庫返回
?? 假設每次請求花費 10ms,總耗時大約:
1000 次 × 10ms = 10,000ms ≈ 10秒
使用 motor.AsyncIOMotorClient
(異步 + 并發):
from motor.motor_asyncio import AsyncIOMotorClient
import asyncioclient = AsyncIOMotorClient()
db = client["mydb"]
users = db["users"]async def get_user(i):return await users.find_one({"_id": i})results = await asyncio.gather(*[get_user(i) for i in range(1000)]) # 并發執行
💡 因為是并發的,可以同時發出多個請求,假設最多100個并發連接:
1000 次 ÷ 100 并發批次 × 10ms ≈ 100ms
? 總時間只需要 ~0.1 秒,而不是 10 秒!性能提升 100 倍!
? 總結對比表
特性 | pymongo.MongoClient (同步) | motor.AsyncIOMotorClient (異步) |
---|---|---|
編程模式 | 同步,阻塞 | 異步,非阻塞(await ) |
適用場景 | 腳本、數據分析、低并發后端 | FastAPI、aiohttp 等高并發后端 |
并發性能 | 差,串行執行 | 高,可并發處理成百上千請求 |
代碼復雜度 | 低 | 稍高(需要 async def + await ) |
官方推薦 | 適合非異步項目 | 適合異步框架 |
🔧 技術選型建議:
如果你是用… | 推薦使用 |
---|---|
Flask、Django | pymongo.MongoClient |
FastAPI、aiohttp、Sanic | motor.AsyncIOMotorClient |