Pymongo、连接池和通过Celery的异步任务

0 投票
1 回答
1215 浏览
提问于 2025-04-16 23:09

我正在使用pymongo来访问mongodb,同时我的应用程序还使用Celery来执行许多异步任务。我知道pymongo的连接池不支持异步工作者(根据文档)。

为了访问集合,我有一个集合类,它封装了一些适合我应用程序的逻辑。我正在尝试理解一些我继承的代码,这段代码与这个封装有关:

  • 目前,每个集合都会创建自己的连接实例。根据我所阅读的内容,这样做是不对的,我应该只创建一个连接实例(在settings.py或类似的地方),然后在我的集合实例中引用它。这一点很清楚。关于推荐的最大连接数有什么指导吗?当前的代码显然创建了很多连接/套接字,因为它并没有真正利用连接池的功能。

  • 不过,由于某些代码同时被异步的celery任务和同步运行调用,我不太确定该如何处理这个问题。我的想法是为任务实例化新的连接实例,而对同步的任务使用那个单一的连接实例(当然在每次活动完成后要结束请求)。这样做方向对吗?

谢谢!

哈雷尔

1 个回答

0

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

在你的情况下,“异步”这个词可以理解为你的应用对要求的一致性有多么不稳定。

像“x += 1”这样的操作在你的应用中永远不会是一致的。如果你能接受这种情况,那就没问题。如果你有一些“关键”的操作,那你必须想办法实现一些锁来保证同步。

至于最大连接数,我不知道确切的数字,所以你可以自己测试一下再决定。

如果你需要速度和内存效率,可以看看Redis和这个例子。根据我做的一些基准测试,Redis的Python驱动在读写方面至少比pymongo快两倍。

撰写回答