与PyMongo和gevent的僵局

时间:2012-08-28 10:26:05

标签: python mongodb pymongo gevent greenlets

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

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

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

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

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

1 个答案:

答案 0 :(得分:4)

我发现了问题所在。默认情况下,PyMongo没有在连接上定义网络超时,因此发生的事情是池中的连接断开连接(因为它们暂时不使用)。然后,当我尝试重用连接并执行" find"时,连接被检测为死(需要15分钟)需要很长时间。当连接被检测为死亡时,"发现" call finally抛出一个AutoReconnectError,并生成一个新连接以替换为过时的连接。

解决方案是设置一个小的网络超时(15秒),以便调用"找到"阻止greenlet 15秒,引发AutoReconnectError,当"找到"重试,它获得一个新的连接,操作成功。