pymongo连接池和客户端请求

时间:2012-06-10 12:01:38

标签: python pymongo

我知道pymongo是线程安全的,并且有一个内置的连接池。

在我正在处理的网络应用中,我正在为每个请求创建一个新的连接实例。

我的理解是,由于pymongo管理连接池,因此在每个请求上创建新连接并不是错误的方法,因为在请求结束时,连接实例将被回收并且可用随后的请求。

我在这里是否正确,或者我应该创建一个单个实例以用于多个请求?

1 个答案:

答案 0 :(得分:8)

“错误的方法”取决于应用程序的体系结构。由于pymongo是线程安全的和自动连接池,单个共享连接或多个连接的实际使用将“起作用”。但结果将取决于您对行为的期望。文档对这两种情况都有评论。

如果您的应用程序是线程化的,那么从文档中访问连接的每个线程都将获得自己的套接字。因此,无论您是创建单个共享连接还是请求新连接,都可以归结为您的请求是否有线程。

使用gevent时,每个greenlet可以有一个套接字。这意味着您不必每个请求都有一个真正的线程。请求可以是异步的,并且仍然可以获得自己的套接字。

简而言之:

  • 如果您的webapp请求是线程化的,那么访问新连接的方式无关紧要。结果将是相同的(每个线程的套接字)
  • 如果您的webapp通过gevent异步,那么访问新连接的方式无关紧要。结果将是相同的。 (每个greenlet的插座)
  • 如果您的网络应用程序是异步的,但不是通过gevent,那么您必须考虑best suggested workflow上的注释。