0

我目前正在研究分布式计算。我的工作人员通过将结果插入 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

4

1 回答 1

0

可能发生的情况是,您每秒多次创建客户端、插入文档并关闭客户端。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 常见问题解答

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

于 2016-12-07T19:33:33.350 回答