簡體   English   中英

重復的瞬態套接字連接 - 內存泄漏風險?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM