繁体   English   中英

如何强制pymongo关闭套接字?

[英]How can I force pymongo to close sockets?

我目前正在从事分布式计算。 我的工作人员通过将结果插入到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个),最大工作线程数为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

可能发生的情况是,您每秒创建一个客户端,插入一个文档,然后关闭客户端。 MongoClient可能需要一两秒钟才能完成其关闭过程。 (MongoClient在每个服务器上启动一个后台线程,并且这些线程不会立即退出。)即使MongoClient完全关闭了其套接字,MongoDB服务器也将花费几秒钟的时间清理与TCP连接和操作系统网络有关的所有资源。层需要几分钟的时间来清理。 (请参阅Wikipedia的TCP条目中的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。 永远不要关闭它。

另请参阅PyMongo常见问题解答

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM