Python 与PyMongo和gevent的僵局

Python 与PyMongo和gevent的僵局,python,mongodb,pymongo,gevent,greenlets,Python,Mongodb,Pymongo,Gevent,Greenlets,我正在使用Django应用程序中的PyMongo和gevent。在生产中,它托管在Gunicorn上 我在应用程序启动时创建一个连接对象。我有一些后台任务持续运行,每隔几秒钟执行一次数据库操作 该应用程序还像任何Django应用程序一样提供HTTP请求 我的问题如下。它只发生在生产环境中,我无法在我的开发环境中复制它。当我让应用程序空闲一段时间(尽管后台任务仍在运行)时,在第一个HTTP请求(实际上是前几个)上,我执行的第一个“查找”操作永远不会完成。事实上,绿色小轮从未恢复。这会导致前几个HT

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

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

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

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


我怎样才能解决这个问题?这是gevent和/或PyMongo中的错误吗?

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


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

您使用的pymongo版本是什么?