我正在Django应用程序中同时使用PyMongo和gevent.在生产中,它托管在Gunicorn上.
我在启动应用程序时创建了一个Connection对象.我有一些后台任务连续运行,每隔几秒钟执行一次数据库操作.
该应用程序还可以像任何Django应用程序一样处理HTTP请求.
我的问题如下.它仅在生产中发生,我无法在我的开发环境中复制它.当我让应用程序空闲一段时间(尽管后台任务仍在运行)时,在第一个HTTP请求(实际上是前几个)上,我执行的第一个“查找”操作从未完成.实际上,greenlet永远不会恢复.这将导致前几个HTTP请求超时.
我该如何解决?那是gevent和/或PyMongo中的错误吗?
解决方法:
我发现了问题所在.默认情况下,PyMongo没有在连接上定义网络超时,因此发生的是池中的连接已断开连接(因为它们已经有一段时间没有使用了).然后,当我尝试重用连接并执行“查找”时,要花费很长时间才能将连接检测为无效(大约15分钟).当检测到连接失效时,“ find”调用最终将引发AutoReconnectError,并产生一个新连接以替换为陈旧的连接.
解决方案是设置一个小的网络超时时间(15秒),以便对“ find”的调用将绿色组件阻塞15秒,并引发AutoReconnectError,并且在重试“ find”时,它将获得一个新的连接,并且操作成功.