2011-08-08 45 views
0

我正在使用pymongo訪問也使用Celery執行許多異步任務的應用程序中的mongodb。我知道pymongo的連接池不支持異步工作者(基於文檔)。Pymongo,通過Celery進行連接池和異步任務

訪問集合我有一個集合類包裝某些適合我的應用程序的邏輯。我試圖理解我用這個包裝器繼承的一些代碼:

  • 此刻的每個集合都創建自己的Connection實例。根據我讀的內容,這是錯誤的,我應該有一個單獨的Connection實例(在settings.py或類似的文件中)並將其導入到我的Collection實例中。這一點很清楚。就建議的最大連接數而言,是否有指導原則?當前的代碼肯定會創建大量的連接/套接字,因爲它並不真正利用池化設施。

  • 但是,由於一些代碼是從異步芹菜任務中調用的並且正在同步運行,所以我不知道如何處理這個問題。我的想法是爲這些任務實例化新的Connection實例,並將其用於同步的實例(每次活動完成後,ending_request當然)。這是正確的方向嗎?

謝謝!

哈雷爾

回答

0

從pymongo的文檔:「PyMongo是線程安全的,甚至提供了內置的連接池線程應用程序。」

您的情況中的「異步」一詞可以翻譯成您的應用程序具有多少「不一致」要求。

像「x + = 1」這樣的語句在您的應用中永遠不會一致。如果你能負擔得起,這沒有問題。如果你有「關鍵」操作,你必須以某種方式實現一些同步鎖。

至於最大連接數,我不知道確切的數字,所以測試並繼續。

如果需要速度和內存效率,也請看Redisexample。從我做的一些基準測試中,Redis python驅動程序的讀/寫速度至少比pymongo快兩倍。