2012-08-28 71 views
3

我從Django應用程序一起使用PyMongo和gevent。在生產中,它被託管在Gunicorn上。PyMongo和gevent造成的死鎖

我在創建應用程序時創建了一個Connection對象。我有一些後臺任務連續運行並每隔幾秒執行一次數據庫操作。

該應用程序還可以像任何Django應用程序一樣提供HTTP請求。

我遇到的問題是以下幾點。它只發生在生產環境中,我無法在我的開發環境中重現它。當我讓應用程序閒置一段時間(儘管後臺任務仍在運行)時,在第一個HTTP請求(實際上是前幾個)上,我執行的第一個「find」操作從未完成。 greenlet實際上從不恢復。這會導致前幾個HTTP請求超時。

我該如何解決這個問題?這是gevent和/或PyMongo中的錯誤嗎?

+0

您使用的是哪種版本的pymongo? – stbrody

回答

4

我發現問題所在。默認情況下,PyMongo在連接上沒有定義網絡超時,所以發生的事情是池中的連接斷開連接(因爲它們暫時不用)。然後,當我嘗試重新使用連接並執行「查找」時,連接被檢測爲死亡(類似15分鐘)需要很長時間。當連接被檢測爲死亡時,「find」調用最終拋出一個AutoReconnectError,並且產生一個新的連接以替換舊的連接。

解決的辦法是設置一個小型網絡超時(15秒),使呼叫「查找」塊greenlet 15秒,提出了一個AutoReconnectError,並且重試時,「發現」,它得到一個新的連接,操作成功。