迁移到PyMongo Async
重要
PyMongo异步驾驶员是实验性的。我们不建议在生产环境中使用它。本指南中描述的类、方法和行为在正式发布之前可能会发生变化。如果您在使用PyMongo Async 时遇到任何问题,可以在 问题和帮助 页面上学习;了解如何报告这些问题。
Overview
PyMongo异步驾驶员是PyMongo和Motor库的统一。在本指南中,您可以了解将应用程序从PyMongo或Motor迁移到PyMongo异步驾驶员时必须进行的更改。
同步与异步
要确定是迁移到PyMongo异步驾驶员还是继续使用同步PyMongo,请考虑本节中的信息。
如果您的应用程序或使用案例符合以下条件,则首选同步PyMongo :
您的应用程序执行起来很简单,或者您希望避免在代码中使用异步调用
您的应用程序依赖于串行工作负载或响应时间非常快的工作负载
调试应用程序时,您更喜欢简单的同步逻辑
如果您的应用程序或使用案例符合以下条件,请考虑迁移到PyMongo异步驾驶员:
您的应用程序实施大型、高度并发的工作负载(大约数千个并发操作)
您的应用程序依赖于花费很长时间等待响应或写入数据的工作负载
您的应用程序依赖于其他异步库或框架,例如 FastAPI
从Motor迁移
警告
Motor弃用
PyMongo异步驾驶员是实验性的。我们不建议在生产环境中使用它。
Motor将在PyMongo异步驾驶员正式发布一年后被弃用。我们强烈建议Motor用户在Motor仍受支持的情况下迁移到PyMongo异步驾驶员。
PyMongo异步驾驶员的功能与Motor库类似,但由于直接使用Python Asyncio 而不是将工作委托给线程池,因此可以改善延迟和吞吐量。 在大多数情况下,您可以使用 AsyncMongoClient
代替 MotorClient
,并将应用程序的导入语句更改为从 pymongo
导入,从而将现有Motor应用程序直接迁移到PyMongo Async。
以下示例显示了在Motor中与PyMongo Async 中使用客户端进行写入操作的导入差异:
# Motor client import from motor.motor_asyncio import AsyncIOMotorClient # PyMongo Async client import from pymongo import AsyncMongoClient
要查看PyMongo异步驾驶员中可用的异步方法列表,请参阅异步方法部分。要学习;了解与PyMongo对应的Motor版本,请参阅兼容性指南的Motor兼容性部分。
以下部分介绍了从Motor迁移到PyMongo异步驾驶员程序时必须在应用程序中实现的方法签名更改。
警告
PyMongo异步驾驶员不支持Tornado。
方法签名更改
以下Motor方法签名在PyMongo异步驾驶员中的行为有所不同:
AsyncMongoClient.__init__()
不接受io_loop
参数。AsyncCursor.each()
不存在于PyMongo异步驾驶员中。MotorGridOut.stream_to_handler()
不存在于PyMongo异步驾驶员中。AsyncCursor.to_list(0)
在PyMongo异步驾驶员中无效。 请改用to_list(None)
。MongoClient
是线程安全的,可由多个线程使用,但是,AsyncMongoClient
不是线程安全的,只能由单个事件循环使用。
警告
Motor用户在切换到PyMongo异步驾驶员时可能会遇到性能下降的情况。这是由于PyMongo异步驾驶员使用原生asyncio
任务而不是基于线程的执行程序。基于线程的执行程序具有与同步驾驶员类似的性能特征,但速度较慢。这意味着它们对于不符合上述PyMongo异步驾驶员标准的工作负载具有更好的性能。
如果您遇到性能下降的情况,请确定您的使用案例是否需要PyMongo异步驾驶员。如果您确定同步PyMongo更适合您的使用案例,请考虑使用带有asyncio.loop.run_in_executor()
的同步驾驶员以实现异步兼容性。要学习;了解更多信息,请参阅事件循环API文档。
从PyMongo迁移
PyMongo异步驾驶员的行为与PyMongo类似,但所有执行网络操作的方法都是协程,必须等待。要从PyMongo迁移到PyMongo Async,您必须通过以下方式更新代码:
将所有使用的
MongoClient
替换为AsyncMongoClient
。为所有异步方法调用添加
await
关键字。如果在函数内调用异步方法,请将该函数标记为
async
。
从同步PyMongo迁移到PyMongo异步驾驶员时,请记住以下几点:
要将
AsyncCursor
转换为列表,必须使用异步cursor.to_list()
方法。PyMongo Async驾驶员中的
AsyncCollection.find()
方法是同步的,但会返回AsyncCursor
。要遍历游标,必须使用async for
循环。AsyncMongoClient
对象不支持connect
关键字参数。不能跨线程或事件循环股票
AsyncMongoClient
对象。要访问权限异步调用返回结果的属性或方法,必须将该调用正确括在括号中,如以下示例所示:
id = (await posts.insert_one(doc)).inserted_id
异步方法
有关PyMongo异步驾驶员中可用的异步方法的完整列表,请参阅API文档。
注意
上述API文档中未列出的任何方法都是同步的。