gpt4 book ai didi

python - 重复的 transient 套接字连接 - 内存泄漏风险?

转载 作者:太空宇宙 更新时间:2023-11-04 10:50:49 25 4
gpt4 key购买 nike

我正在编写一个脚本来打开一个文本文件并循环遍历每一行(每行之间暂停几秒钟)。对于每一行,它打开一个 transient 客户端套接字连接并将文本发送到主机服务器。主机响应可能会也可能不会;这两种方式都没有关系。

我已经遇到了无法与现有套接字对象重新连接的 Python 套接字限制(因为这样做会触发异常 EBADF,'Bad file descriptor')。所以我正在为每个 transient 连接创建一个新的套接字实例。那么技巧当然就变成了如何避免内存泄漏。

我处理这个问题的方法是将创建、使用和关闭套接字的整个部分都推给一个函数——依靠 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 ,请记住:

"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 的。阅读 gc.set_threshold() 的文档了解垃圾收集在 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 之前会有相当数量的分配。您可以通过运行 gc.collect()强制垃圾回收.

关于python - 重复的 transient 套接字连接 - 内存泄漏风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14082142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com