[英]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.