我有一個服務器子類產生線程響應處理程序,處理程序依次啓動應用程序線程。一切都很順利,除非我使用ObjGraph我看到正在運行的應用程序線程的正確數量(我正在進行負載測試並阻止了35個應用程序實例的運行)。Python多線程應用程序與特定於線程的記錄器實例的內存泄漏
調用objgraph.typestats()提供了每個對象當前在解釋器中生存多少個實例的細分(根據GC)。查看內存泄漏的輸出,我發現700個記錄器實例 - 這將是服務器產生的響應處理器的總數。
我已經調用logger.removehandler(memoryhandler)和logger.removehandler(filehandler),當應用程序線程退出run()方法以確保沒有對記錄器實例的延遲引用時,記錄器實例也完全隔離在應用程序線程內(沒有外部引用)。作爲消除這些記錄器實例的最後一步,run()中的最後一條語句是del self.logger
要在init()中獲取記錄器,我提供一個適當大的隨機數來命名它,文件訪問 - 我使用相同的大數字作爲日誌文件名的一部分,以避免應用程序日誌衝突。
長和短是我有700個跟蹤GC的記錄器實例,但只有35個活動線程 - 我該如何去關閉這些記錄器?一個更麻煩的工程師解決方案是創建一個記錄器池,並在應用程序線程的生命週期中獲取一個,但是當GC應該自動處理時,創建更多的代碼來維護。