私はサーバーサブクラスでスレッドレスポンスハンドラを生成し、ハンドラはアプリケーションスレッドを開始します。 ObjGraphアプリケーションスレッドが正しく実行されていることを確認しています(私は負荷テストを行っており、アプリケーションインスタンスを35個実行するように調整しています)。スレッド固有のロガーインスタンスからのメモリリークを伴うPythonマルチスレッドアプリケーション
objgraph.typestats()を呼び出すと、各オブジェクトのインスタンスがインタプリタ内に現在いくつ存在しているかが分かります(GCに従って)。メモリリークの出力を見ると、700ロガーインスタンスが見つかります。これは、サーバーによって生成されたレスポンスハンドラの総数です。
アプリケーションスレッドがrun()メソッドを終了し、ロガーインスタンスへの参照が残っていないこと、またロガーインスタンスが完全に分離されていることを確認するには、logger.removehandler(memoryhandler)とlogger.removehandler (外部参照はありません)。これらのロガーインスタンスを削除する最終的なスタブとして、del()の最後のステートメントはdel self.loggerです。
init()でロガーを取得するには、適切な大きさの乱数を付けてファイルアクセス - アプリケーションログの衝突を避けるために、ログファイル名の一部と同じ大きな番号を使用します。
長短ですが、私はGCによって追跡された700のロガーインスタンスを持っていますが、アクティブなスレッドは35個しかありません。これらのロガーを強制終了するにはどうすればよいですか?より厄介なエンジニアソリューションは、ロガーのプールを作成し、アプリケーションスレッドの寿命の間に取得するだけですが、GCがこれを自動的に処理する必要がある場合に、より多くのコードを作成して維持します。