当前位置: 首页 > 知识库问答 >
问题:

在PyMongo中,MongoClient的maxPoolSize=100的默认值无效?

阎星华
2023-03-14

以下是PyMongo连接的简单测试片段:

from pymongo import MongoClient

clients = [] 
for i in range(0,1000):
    con = MongoClient('mongodb://localhost:27017/')
    clients.append(con)
    print(i)

以下是输出:

......998 999

以下是MongoDB控制台中的输出:

2018-03-24T20:00:55.746 0530 I网络[listener]连接已从127.0.0.1:51272#1500(现在有1000个连接打开)接受2018-03-24T20:00:55.747 0530 I网络[conn1500]从127.0.0.1:51272 conn:{驱动程序:{名称:“PyMongo”,版本:“3.6.1”,操作系统:{type:“Darwin”,名称:“Darwin”,体系结构:“x86_64”,版本:“10.1”},平台:“CPython 3.6.0.final.0”}2018-03-24T20:00:55.773 0530 I网络[conn1486]端连接127.0.0.1:51286(999个连接现在打开)2018-03-24T20:00:55.773 0530 I网络[conn1485]端连接127.0.0.1:51285(998个连接现在打开)2018-03-24T20:00:55.773 0530 I网络[conn1484]端连接127.0.0.1:51284(997个连接现在打开)。

我看到MongoClient有一个关键字参数maxPoolSize。默认值只有100。

但是上面的代码是如何工作的呢?

共有1个答案

佴波鸿
2023-03-14

MongoClient有一个关键字参数maxPoolSize。默认值只有100。

没错。PyMongo(从v3.6开始)MongoClient中的maxPoolSize默认值为100。但是,maxPoolSize参数控制每个MongoDB服务器上MongoClient实例的最大内置连接池。

您的示例片段创建了1000个MongoClient实例。请注意,每个进程只需要一个MongoClient,并将其重用于所有操作。为每个请求创建一个新客户端是一个常见的错误,这是非常低效的。

但是上面的代码是如何工作的呢?

如果您想检查限制是否有效,可以使用Python线程模块创建线程来测试MongoClient连接的限制。

您还可以使用另外两个参数:

>

waitQueueTimeoutMS:此参数设置线程在从池中获得连接之前应在队列中等待多长时间。通过设置低maxPoolsize和低waitQueueTimeoutMS您的代码将收到ConnectionFailure异常。

例子:

def worker(num, db): 
    print("Thread number %s" % num)
    try:
        print(db.test.insert({"a":num, "b":num*2}))
    except Exception as e: 
        print("Exception: %s" % e)
    return 

client = MongoClient("mongodb://localhost:27017/", 
                     maxPoolSize=1, 
                     waitQueueTimeoutMS=1, 
                     waitQueueMultiple=1)
database = client.test
threads = []

for i in range(100): 
    t = threading.Thread(target=worker, args=(i, database))
    threads.append(t) 
    # Start thread.
    t.start()

# Wait for all threads to complete. 
for t in threads: 
    t.join() 

看看连接池在PyMongo中是如何工作的?更多细节。请使用提供的默认值,除非您有需要更改上述值的特定用例。

 类似资料:
  • 问题内容: 我遇到了一个无法解决的SQL愚蠢问题。 错误: 有人可以帮我吗? 问题答案: 仅在字段上可接受。字段必须保留为空的默认值,或者根本不保留任何默认值- 默认值必须为常量值,而不是表达式的结果。 相关文档:http : //dev.mysql.com/doc/refman/5.0/en/data-type- defaults.html 您可以通过在表上设置插入后触发器以在任何新记录上填充“

  • 我正在学习一个在线课程,包括创建一个Wordpress插件。当我尝试按照说明(并使用提供的代码排除我这边的任何错误)创建自定义表时,出现了一个问题。这是原始代码的一部分: MySQL(意大利语)的本地设置可能会产生任何问题吗?MySQL版本为::5.7.21-0Ubuntu0.16.04.1-(Ubuntu)。PHP版本7.0.22。Wordpress版本:4.9.2。谢谢你。

  • 问题内容: 在我的应用程序中,我有一个“编辑用户详细信息”页面,我想在相应的editText字段中显示当前名称,电子邮件地址等,然后用户可以删除它们并根据需要输入一个新名称。 有没有办法做到这一点?谢谢你的帮助 问题答案: 您可以用来设置EditText字段的当前文本。 例:

  • 问题内容: 我正在使用Hibernate来持久化该bean。 有什么用? 问题答案: CascadeType 默认为空数组 。请参见注释类型OneToOne中的CascadeType。 默认情况下,没有操作级联。

  • 问题内容: 如何在Doctrine 2中设置默认值? 问题答案: 数据库默认值不受“便携式”支持。使用数据库默认值的唯一方法是通过mapping属性,在该属性中为字段所映射的列指定代码段(包括原因在内)。 您可以使用: 最好使用PHP级别的默认值,因为这些值也可以在新创建和持久保存的对象上正确使用(持久保存新对象以获取默认值后,Doctrine不会返回数据库)。

  • 问题内容: 无法找到文档中的默认值 https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/query-dsl- minimum-should- match.html 是还是,还是取决于查询是否具有正义或上下文? 问题答案: 默认值取决于查询和上下文: :在查询上下文中且单独存在(否或) :在过滤器上下文中(例如,在查询