3

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

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

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

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

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

4

1 回答 1

4

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

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

于 2012-08-28T16:37:40.013 回答