我正在编写一个脚本,它打开一个文本文件并遍历每一行(每行之间暂停几秒钟)。对于每一行,它打开一个临时的客户机套接字连接,并将文本发送到主机服务器。主机响应可能出现,也可能不响应;这两种方式都无所谓。在
我已经遇到了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) 有没有更直接的方法来确保在我完成后每个实例都被删除?在
首先,正常情况下只为单个交换机使用一个套接字。参见socket HOWTO。在
python的一个优点是,通常您不必担心垃圾收集。除非你有真正的内存使用问题,否则你不应该这样做。在
从this webpage开始,请记住:
因此,如果函数内部创建的套接字没有在其他地方引用,那么它应该超出作用域并被释放(但不是gc-ed)。下面的内容可能是cpython特有的。阅读^{} 的文档,了解如何在cpython中进行垃圾收集。尤其是:
阈值的标准值(以cpython为单位)为:
因此,在运行gc之前,heva应该有相当数量的分配。通过运行^{} ,可以强制垃圾回收。在
相关问题 更多 >
编程相关推荐