【问题标题】:How can I force pymongo to close sockets?如何强制 pymongo 关闭套接字?
【发布时间】:2017-04-22 06:43:27
【问题描述】:

我目前正在研究分布式计算。 我的工作人员通过将其插入 mongoDB 数据库来返回结果。代码运行良好,但连接仍然打开,并且有一刻我的系统用完了套接字。 这是我的工人代码:

def worker(elt):
    client=pymongo.MongoClient(MONGODB_URI)
    db = client.get_default_database()
    essaiElt = db['essaiElt']
    #compute here
    essaiElt.insert( elt.toDict())
    client.close()

通过使用“netstat -anbo”这个命令,我可以看到所有的套接字仍然打开(超过 3000 个),worker 的最大数量是 14,但他们必须处理超过 10 000 个任务。

...
TCP 10.130.151.11:4999 10.130.137.128:27017 En attente 0
TCP 10.130.151.11:5000 10.130.137.128:27017 En attente 0

我尝试设置超时,但没有任何效果。

如何在不重新启动数据库的情况下关闭套接字?

Python 2.7.12 Pymongo 3.3 mongoDB 3.2.10

【问题讨论】:

  • “在此处计算”部分执行需要多长时间?在进程退出之前,单个 Python 进程是向数据库中插入许多文档还是只插入一个?
  • “在此处计算”部分执行需要多长时间?其实它是空的。在进程退出之前,单个 Python 进程是否将许多文档插入数据库,或者只插入一个?工作人员由 pp 库(并行 python)管理,因此它获取任务,创建套接字,插入元素,关闭套接字并获取另一个任务以再次执行相同操作。所以一个工人最终创建了很多套接字。

标签: python mongodb pymongo pymongo-3.x


【解决方案1】:

可能发生的情况是,您每秒多次创建客户端、插入文档并关闭客户端。 MongoClient 可能需要一两秒钟来完成其关闭过程。 (MongoClient 为每个服务器启动一个后台线程,这些线程不会立即退出。)即使 MongoClient 完全关闭其套接字,MongoDB 服务器也需要几秒钟来清理与 TCP 连接和操作系统网络相关的所有资源层需要几分钟才能清理干净。 (请参阅Wikipedia's TCP entry 中的 TIME-WAIT 状态。)

通常,您应该在 Python 进程开始时创建一个 MongoClient,并在整个 Python 进程生命周期中使用一个 MongoClient:

client = pymongo.MongoClient(MONGODB_URI)

def worker(elt):    
    db = client.get_default_database()
    essaiElt = db['essaiElt']
    #compute here
    essaiElt.insert( elt.toDict())

不要为每个操作创建一个新的 MongoClient。永远不要关闭它。

另见the PyMongo FAQ

为每个进程创建一次此客户端,并将其重用于所有操作。为每个请求创建一个新客户端是一个常见的错误,效率非常低。

【讨论】:

  • “永远不要关闭它。” — 什么时候关闭?
  • 当你的 Python 进程退出时它会自动关闭。在此之前没有理由关闭 MongoClient。
  • 这是有价值的信息!您是说pymongo 开发人员出于彻底性而公开了.close 方法,还是“从不”夸大其词并且它具有合法的用例?
  • 我不知道为什么我们曾经公开过“关闭”方法,请忘记它的存在。 =)
  • 看不到理由并不否定其他人需要它。我正在开发一个创建与 mongo 连接的实验室的过程。实验室完成后,我也希望连接完成。在不重新设计实验室使用预先存在的组件(包括 mongo 连接器)的基本方式的情况下——当一个实验室完成时 CLOSE() 以便我可以运行下一个是我需要和想要使用的,但它不起作用。我应该总是能够在不关闭解释器的情况下清理我创建的任何资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
相关资源
最近更新 更多