2012-06-10 102 views
15

我知道pymongo是線程安全的並具有內置連接池。pymongo連接池和客戶端請求

在我正在處理的Web應用程序中,我正在爲每個請求創建一個新的連接實例。

我的理解是,由於pymongo管理連接池,所以在每個請求上創建一個新連接並不是錯誤的方法,因爲在請求結束時連接實例將被回收並在後續請求中可用。

我在這裏糾正,還是應該創建一個跨多個請求使用的實例?

回答

8

「錯誤的方法」取決於您的應用程序的體系結構。由於pymongo是線程安全和自動連接池,實際使用單個共享連接或多個連接將「正常工作」。但結果將取決於你期望的行爲。文件對這兩種情況的評論。

如果您的應用程序是通過文檔進行線程化的,則訪問連接的每個線程都將獲得自己的套接字。因此,無論您是創建單個共享連接還是請求新共享連接,都取決於您的請求是否是線程化的。

使用gevent時,每個greenlet可以有一個套接字。這意味着您不必爲每個請求創建一個真正的線程。這些請求可以是異步的,並且仍然可以獲得它們自己的套接字。

一言以蔽之:

  • 如果你的web應用程序的請求線程,那麼它不會不管你訪問一個新的連接哪種方式。結果將是相同的(每個線程套接字)
  • 如果您的web應用程序通過gevent異步,那麼訪問新連接的方式並不重要。結果將是相同的。 (每個greenlet的插座)
  • 如果您的web應用程序是異步的,但不是通過gevent,那麼您必須考慮關於best suggested workflow的註釋。