重复的transientsocket连接内存泄漏风险?

2024-10-01 13:36:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个脚本,它打开一个文本文件并遍历每一行(每行之间暂停几秒钟)。对于每一行,它打开一个临时的客户机套接字连接,并将文本发送到主机服务器。主机响应可能出现,也可能不响应;这两种方式都无所谓。在

我已经遇到了Python套接字限制,在这个限制中不能重新连接现有的socket对象(因为这样做会触发异常EBADF, 'Bad file descriptor')。所以我为每个临时连接创建一个新的套接字实例。当然,诀窍在于如何避免内存泄漏。在

我处理这个问题的方法是将创建、使用和关闭套接字的整个过程推送到一个函数中——在我处理完每个实例之后,依靠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) 有没有更直接的方法来确保在我完成后每个实例都被删除?在


Tags: 实例方法内存脚本timeresponselinesocket
1条回答
网友
1楼 · 发布于 2024-10-01 13:36:09

首先,正常情况下只为单个交换机使用一个套接字。参见socket HOWTO。在

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

this webpage开始,请记住:

"Python won’t clean up an object when it goes out of scope. It will clean it up when the last reference to it has gone out of scope."

因此,如果函数内部创建的套接字没有在其他地方引用,那么它应该超出作用域并被释放(但不是gc-ed)。下面的内容可能是cpython特有的。阅读^{}的文档,了解如何在cpython中进行垃圾收集。尤其是:

"When the number of allocations minus the number of deallocations exceeds threshold0, collection starts."

阈值的标准值(以cpython为单位)为:

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

因此,在运行gc之前,heva应该有相当数量的分配。通过运行^{},可以强制垃圾回收。在

相关问题 更多 >