【问题标题】:Deadlock with PyMongo and geventPyMongo 和 gevent 的死锁
【发布时间】:2023-03-27 09:18:01
【问题描述】:

我在 Django 应用程序中同时使用 PyMongo 和 gevent。在生产中,它托管在 Gunicorn 上。

我在我的应用程序启动时创建了一个连接对象。我有一些后台任务连续运行,每隔几秒执行一次数据库操作。

该应用程序还像任何 Django 应用程序一样处理 HTTP 请求。

我遇到的问题如下。它只发生在生产中,我无法在我的开发环境中重现它。当我让应用程序空闲一会儿(尽管后台任务仍在运行)时,在第一个 HTTP 请求(实际上是前几个)上,我执行的第一个“查找”操作永远不会完成。 greenlet 实际上永远不会恢复。这会导致前几个 HTTP 请求超时。

我该如何解决这个问题?这是 gevent 和/或 PyMongo 中的错误吗?

【问题讨论】:

  • 你用的是什么版本的pymongo?

标签: python mongodb pymongo gevent greenlets


【解决方案1】:

我发现了问题所在。默认情况下,PyMongo 没有在连接上定义网络超时,所以发生的事情是池中的连接断开连接(因为它们有一段时间没有使用)。然后,当我尝试重用连接并执行“查找”时,需要很长时间才能检测到连接已失效(大约 15 分钟)。当检测到连接失效时,“find”调用最终会引发 AutoReconnectError,并生成一个新连接以替换旧连接。

解决方法是设置一个小的网络超时时间(15秒),这样“find”的调用会阻塞greenlet 15秒,引发AutoReconnectError,当“find”重试时,它会获得一个新的连接,操作成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2015-10-26
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多