Django pre-shutdown hook 关闭挂起的pymongo连接

标签 django pymongo

我在 Django 项目中使用 pymongo,最近我开始遇到一个问题,在退出主 Django 进程(即使通过管理命令)后,pymongo 连接将挂起,并且进程永远不会导出。显然,堆栈中的某个地方出了问题,但目前最好的解决方案似乎是在 Django 退出之前显式关闭连接。

那么:Django 是否为此提供了预关闭信号或 Hook ?

顺便说一句:如果您有兴趣,我的连接代码。

from django.conf import settings
from pymongo import ReplicaSetConnection, ReadPreference

conn = ReplicaSetConnection(
    hosts_or_uri=settings.MONGO['HOST'],
    replicaSet=settings.MONGO['REPLICASET'],
    safe=settings.MONGO.get('SAFE', False),
    journal=settings.MONGO.get('JOURNAL', False),
    read_preference=ReadPreference.PRIMARY
)

db = getattr(conn, settings.MONGO['DB'])

(出于好奇,这是在 pymongo 中进行连接池的正确方法吗?)

最佳答案

虽然这不能解决您的问题,但挂起是在 2012 年 7 月提交给 pymongo 时引入的:https://github.com/mongodb/mongo-python-driver/commit/1fe6029c5d78eed64fcb2a6d368d9cdf8756d2f4#commitcomment-1820334 .

具体来说,它只影响 ReplicaSetConnections。他们给出的答案是调用 connection.close(),但正如您在问题中正确指出的那样,没有关闭连接的好钩子(Hook)。

我相信您可以在每次请求结束时安全地关闭连接。 Django 已经为它与数据库的 ORM 连接做了这个。这就是为什么他们推荐使用像 pgbouncer 这样的连接池,所以重新连接到 postgres 是即时的。 Pymongo 内置了一个连接池,所以可以随意重新连接。

关于Django pre-shutdown hook 关闭挂起的pymongo连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11847418/

相关文章:

python - 如何从具有 ListProperty 的模型创建表单

python - Django 导入错误 : cannot import name 'python_2_unicode_compatible'

python - pymongo.errors.ConfigurationError : The "dnspython" module must be installed to use mongodb+srv://URIs even after pymongo and dnspython installed

javascript - 如何将 JS 变量传递给 JSX 文件

python - Create_Index 在 python 中使用 partialFilterExpression

django - 在 AWS Elastic Beanstalk : WSGIPath not found 上设置 Django

python - 如何阻止 Django 创建大量不必要的表

python - 为 mongodb 中的网络抓取工具分配 UUID 并检查重复项

python - InvalidBSON 消耗游标并引发 StopIteration。如何跳过坏文档?

django - Django 1.6.2 中的 HTTP_HOST header 无效