2012-06-10 99 views
15

我知道pymongo是线程安全的并具有内置连接池。pymongo连接池和客户端请求

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

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

我在这里纠正,还是应该创建一个跨多个请求使用的实例?

回答

8

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

如果您的应用程序是通过文档进行线程化的,则访问连接的每个线程都将获得自己的套接字。因此,无论您是创建单个共享连接还是请求新共享连接,都取决于您的请求是否是线程化的。

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

一言以蔽之:

  • 如果你的web应用程序的请求线程,那么它不会不管你访问一个新的连接哪种方式。结果将是相同的(每个线程套接字)
  • 如果您的web应用程序通过gevent异步,那么访问新连接的方式并不重要。结果将是相同的。 (每个greenlet的插座)
  • 如果您的web应用程序是异步的,但不是通过gevent,那么您必须考虑关于best suggested workflow的注释。