以下是用于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 NETWORK [listener]连接
  公认
      从127.0.0.1:51272#1500(现在打开1000个连接)
      2018-03-24T20:00:55.747 + 0530我网络[conn1500]收到客户端
      来自127.0.0.1:51272的元数据conn:{驱动程序:{名称:“ PyMongo”,
      版本:“ 3.6.1”},操作系统:{类型:“达尔文”,名称:“达尔文”,
      体系结构:“ x86_64”,版本:“ 10.10.1”},平台:“ CPython
      3.6.0.final.0“} 2018-03-24T20:00:55.773 + 0530 I NETWORK [conn1486]终端连接127.0.0.1:51286(999个连接现已打开)
      2018-03-24T20:00:55.773 + 0530 I NETWORK [conn1485]终端连接
      127.0.0.1:51285(998个连接现已打开)2018-03-24T20:00:55.773 + 0530 I NETWORK [conn1484]终端连接
      127.0.0.1:51284(现已打开997个连接)
      。 。 。
      。 。 。


我看到MongoClient具有关键字参数maxPoolSize。默认值为100。

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

最佳答案

MongoClient具有关键字参数maxPoolSize。默认值为100。


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

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


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


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

您可以利用其他两个参数:


waitQueueMultiple:此参数设置从池中获取连接之前,队列中可以等待多少线程的限制。通过设置较低的maxPoolSize和较低的waitQueueMultiple,您的代码将收到ExceededMaxWaiters异常。
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()


有关更多详细信息,请参见How does connection pooling work in PyMongo?。除非您有特定的用例需要更改以上值,否则请使用提供的默认值。

关于python - 在PyMongo中,MongoClient的maxPoolSize = 100的默认值无效吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49465912/

10-12 16:46