当前位置: 首页 > 知识库问答 >
问题:

重复瞬态-套接字连接-内存泄漏风险?

黄丰
2023-03-14

我所采用的方法是将创建、使用和关闭套接字的整个部分推进到一个函数中--在完成这些操作后,依赖Python的垃圾收集来删除每个实例:

    import socket,select,time

    def transientConnect(host,port,sendData):
        response = ''
        sendSocket = socket.socket()
        sendSocket.connect((serverHost,serverPort))
        sendSocket.send(line)
        gotData = select.select([sendSocket],[],[],2)
        if (gotData[0]):response = sendSocket.recv(65535)
        sendSocket.close()
        return response

    scriptLines = open('testScript.txt','r').readlines()
    serverHost  = '127.0.0.1'
    serverPort  = 15004
    for line in scriptLines:
        response = transientConnect(serverHost,serverPort,line)
        print(response)
        time.sleep(3.0)

我的问题是:(1)这种方法能避免任何内存泄漏吗?(2)有没有更直接的方法来确保每个实例在我完成后都被消除?

共有1个答案

曹鸿风
2023-03-14

首先,通常只对单个交换使用套接字。参见套接字如何操作。

python的一个优点是,一般来说,您不必担心垃圾收集。除非你有真正的内存使用问题,否则你不应该这样做。

在此网页中,请记住:

“当分配数减去释放数超过阈值0时,开始收集。”

阈值的标准值(在cpython中)为:

In [2]: gc.get_threshold()
Out[2]: (700, 10, 10)

因此,在运行gc之前,会有相当数量的分配。您可以通过运行gc.collect()强制垃圾回收。

 类似资料:
  • 我有一个web服务器,它接受传入的websocket连接,在Scala中用akka http实现。然而,我一直观察到我的应用程序的内存使用量单调增加。经过长时间的挖掘,我发现每个连接都会创建一些内部Akka对象,但在客户机断开连接后没有得到清理。特别是这个类:。每个连接都会创建一个这样的新对象。我使用来计算对象的数量,下面提供了命令。我不确定我是不是做错了什么。任何建议都将不胜感激。 我有一个超级

  • 我正在开发一个在Java服务器上运行的游戏。对于数据库池,我使用的是HikariCP,这是一个优秀的库,但它现在抛出了以下错误: 现在我知道连接泄漏意味着打开的连接在某个地方漂浮,但我不知道如何或在哪里漂浮。 下面是我的数据库类中的一个方法,根据堆栈跟踪,错误应该发生在这里。 这只是启动语句的一个基本方法。调用它时,我使用它,然后调用、和 但它告诉我连接是打开的。 我怎么解决这个?谢了!

  • 我正在尝试识别应用程序中的SQL连接泄漏。经过一些操作后,当我的应用程序处于空闲状态(用户未执行任何活动)时,我在返回的结果集中看到7个与我的数据库的连接。所有连接的状态均为,所有连接的值均为。 我正在使用连接池,但连接字符串中未指定连接生存期。这意味着如果我是对的,将使用它的默认值0。连接生存期的值为零意味着SQL server永远不应该关闭连接,对吗? 我让我的应用程序空闲一段时间(15-20

  • 我有一个带有和对象的。每次调用,我都会执行以下操作: 我不关闭,因为没有关闭方法。每次调用servlet时,mongo中使用的连接数都会增加: 什么是与mongo和morphia建立联系的正确方式?这种联系到底在哪里?谢谢

  • 我正在Scala应用程序中使用Apache Http客户端。 该应用程序具有相当高的吞吐量和高并行性。 我不确定,但我想我可能是在泄露连接。似乎每当使用客户机的代码部分变得繁忙时,应用程序就会失去响应。我的怀疑是,我正在泄漏套接字或其他东西,从而导致应用程序的其他方面停止工作。与其说是连接泄漏,还不如说是关闭速度不够快。 对于更多上下文,有时,某些操作会导致此代码每分钟并行执行数百次。当这种情况发