[英]Repeated transient-socket connections - memory leak risk?
我正在編寫一個腳本,打開一個文本文件並循環遍歷每一行(在每一行之間暫停幾秒鍾)。 對於每一行,它將打開一個臨時客戶端套接字連接,並將文本發送到主機服務器。 主持人的回應可能會也可能不會; 兩種方式無關緊要。
我已經遇到了Python套接字限制,你無法重新連接現有的套接字對象(因為這樣做會觸發異常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)有沒有更直接的方法來確保每個實例在完成后都被淘汰了?
首先,僅使用套接字進行單次交換是正常的。 請參閱插座HOWTO 。
關於python的一個好處是,通常你不必擔心垃圾收集。 除非你有真正的內存使用問題,否則你不應該這樣做。
在此網頁上 ,請注意:
“當一個對象超出范圍時,它不會清理它。當它最后一次引用超出范圍時,它會清理它。”
因此,如果在函數內部創建的套接字未在其他地方引用,則它應該超出范圍並被釋放(但不是gc-ed)。 以下內容可能與cpython有關。 閱讀gc.set_threshold()
的文檔,了解垃圾收集在cpython中的工作原理。 特別:
“當分配數量減去解除分配數量超過閾值0時 ,開始收集。”
閾值的標准值(以cpython為單位)是:
In [2]: gc.get_threshold()
Out[2]: (700, 10, 10)
因此,在獲得gc運行之前,會有相當數量的分配。 您可以通過運行gc.collect()
強制進行垃圾回收。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.