0

我正在使用 pymongo 在一个应用程序中访问 mongodb,该应用程序也使用 Celery 执行许多异步任务。我知道 pymongo 的连接池不支持异步工作者(基于文档)。

要访问集合,我有一个 Collection 类,其中包含适合我的应用程序的某些逻辑。我试图理解我用这个包装器继承的一些代码:

  • 目前,每个集合都会创建自己的 Connection 实例。根据我正在阅读的内容,这是错误的,我真的应该有一个 Connection 实例(在 settings.py 等中)并将其导入我的 Collection 实例中。那一点很清楚。关于推荐的最大连接数是否有指导方针?当前的代码肯定会创建很多连接/套接字,因为它并没有真正使用池化设施。

  • 但是,由于一些代码是从异步 celery 任务以及同步运行中调用的,我不确定如何处理这个问题。我的想法是为任务实例化新的 Connection 实例,并将单个实例用于同步的实例(当然在每个活动完成后结束请求)。这是正确的方向吗?

谢谢!

哈雷尔

4

1 回答 1

0

来自 pymongo 的文档:“PyMongo 是线程安全的,甚至为线程应用程序提供了内置的连接池。”

在您的情况下,“异步”这个词可以翻译成您的应用程序有多么“不一致”的要求。

像“x += 1”这样的语句在你的应用程序中永远不会是一致的。如果你能负担得起,就没有问题。如果您有“关键”操作,您必须以某种方式实现一些同步锁。

至于最大连接数,我不知道确切的数字,所以测试并继续。

如果需要速度和内存效率,还请查看Redis和这个示例。从我所做的一些基准测试来看,Redis python 驱动程序的读/写速度至少比 pymongo 快 2 倍。

于 2011-09-17T00:03:30.103 回答