Docs 菜单
Docs 主页
/ / /
Pymongo 驱动程序
/

迁移到PyMongo Async

在此页面上

  • Overview
  • 同步与异步
  • 从Motor迁移
  • 方法签名更改
  • 从PyMongo迁移
  • 异步方法
  • 更多信息

重要

PyMongo异步驾驶员是实验性的。我们建议在生产环境中使用它。本指南中描述的类、方法和行为在正式发布之前可能会发生变化。如果您在使用PyMongo Async 时遇到任何问题,可以在 问题和帮助 页面上学习;了解如何报告这些问题。

PyMongo异步驾驶员是PyMongo和Motor库的统一。在本指南中,您可以了解将应用程序从PyMongo或Motor迁移到PyMongo异步驾驶员时必须进行的更改。

要确定是迁移到PyMongo异步驾驶员还是继续使用同步PyMongo,请考虑本节中的信息。

如果您的应用程序或使用案例符合以下条件,则首选同步PyMongo :

  • 您的应用程序执行起来很简单,或者您希望避免在代码中使用异步调用

  • 您的应用程序依赖于串行工作负载或响应时间非常快的工作负载

  • 调试应用程序时,您更喜欢简单的同步逻辑

如果您的应用程序或使用案例符合以下条件,请考虑迁移到PyMongo异步驾驶员:

  • 您的应用程序实施大型、高度并发的工作负载(大约数千个并发操作)

  • 您的应用程序依赖于花费很长时间等待响应或写入数据的工作负载

  • 您的应用程序依赖于其他异步库或框架,例如 FastAPI

警告

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 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文档中未列出的任何方法都是同步的。

要学习;了解有关异步Python的更多信息,请参阅Python Asyncio 文档。

后退

升级指南