【问题标题】:Proper scoping to instantiate a Connection() object in Pymongo在 Pymongo 中实例化 Connection() 对象的正确范围
【发布时间】:2012-08-20 19:34:24
【问题描述】:

我正在运行一个基于 Flask 的 Web 应用程序,该应用程序使用 Mongodb(与 Pymongo 一起用于 Python)。几乎每个视图都访问数据库,因此我想最有效地利用内存和 CPU 资源。我不确定实例化 pymongo 的 Connection() 对象最有效的方法是什么,该对象用于访问和操作数据库。现在,我在文件顶部声明from pymongo import Connection,然后在我拥有的每个视图函数的开头:

def sampleViewFunction():
    myCollection = Connection()['myDB']['myCollection']
    ## then use myCollection to manipulation the database
    ## more code...

另一种方法是在文件顶部声明:

from pymongo import Connection
myCollection = Connection()['myD']['myCollection']

然后稍后,您的代码将显示为:

def sampleViewFunction():
    ## no declaration of myCollection since it's a global variable
    ## then use myCollection to manipulation the database
    ## more code...

所以唯一的区别是myCollection的声明范围。这两种方法在处理内存的方式和 CPU 消耗方面有何不同?由于这是一个 Web 应用程序,我正在考虑多个用户同时是站点的场景。我想数据库连接的寿命会有所不同,我猜这可能会影响性能。

【问题讨论】:

  • 实际上,对于那些对数据库相当陌生的人来说,这根本不明显。我不了解数据库连接的复杂性以及建立一个连接需要什么。由于 Python 是一种非常高级的语言,我认为询问它如何处理像这样的细微差异是完全合理的。严重地?你对我投了反对票?
  • J-bob - 你的问题是合理的,别担心,有些人有....问题,最终会被标记/否决到遗忘 - 如果我知道更多 python 我会自己回答,但我可以告诉你,通常连接池代码应该为你处理大部分内容,与内存相比,CPU 开销可以忽略不计(通常) - MongoDB 连接的默认堆栈大小为 1MB,因此这通常是主要资源消耗。

标签: python mongodb flask pymongo


【解决方案1】:

您应该使用第二种方法。在 pymongo 中创建连接时,默认情况下会创建一个连接池。有关更多详细信息,请参阅文档,请参阅here。这是做事的正确方法。默认的 max_pool_size 为 10,因此这将为您提供 10 个与 mongod 实例的连接。如果您以另一种方式进行操作并为每个函数调用创建一个池,您将

  1. 创建和破坏与每个函数调用的连接,这会浪费资源 - RAM 和 CPU。
  2. 无法控制您的代码将创建多少连接到 mongod - 您可以用连接淹没 mongod

【讨论】:

  • 好的,这回答了我的问题。但这让我想到——我应该进一步扩大myCollection 变量的范围吗?这是一个相当大的应用程序,其中包含一个“main.py”文件,该文件被导入到许多其他文件中。在“main.py”中声明myCollection然后导入并在任何地方使用它是否有意义?
  • 是的,共享一个全球连接也是个好主意
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 2018-02-13
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多