示例代码:
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 MongoClient
client = 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 asyncio
client = 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 |