Pymongo,通过Celery进行连接池和异步任务

时间:2011-08-08 19:58:19

标签: python django connection-pooling celery pymongo

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

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

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

  • 但是,由于某些代码是从异步芹菜任务调用以及同步运行的,所以我不知道如何处理这个问题。我的想法是为任务实例化新的Connection实例,并使用单个实例用于同步任务(当然,在每个活动完成后,ends_request)。这是正确的方向吗?

谢谢!

Harel的

1 个答案:

答案 0 :(得分:0)

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

您的情况中的“异步”一词可以转化为您的应用程序的“不一致”要求。

“x + = 1”等语句在您的应用中永远不会保持一致。如果你负担得起,没有问题。如果您有“关键”操作,则必须以某种方式实现某些锁以进行同步。

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

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