subprocess.Popen外部プロセスを実行するためのオブジェクトを作成する Python/PyQt/QtWebKit 基盤で実行されている JavaScript アプリケーションがあります。
Popenオブジェクトはディクショナリに保持され、内部識別子によって参照されるため、JS アプリはPopenを介して のメソッドを呼び出して、プロセスがまだ実行されているかどうかを判断したりpyqtSlot、不正なプロセスを強制終了したりできます。poll()kill()
Popenプロセスが実行されなくなった場合、そのオブジェクトを辞書から削除してガベージ コレクションを行いたいと考えています。
メモリリークを防ぐために辞書を自動的にクリーンアップするための推奨されるアプローチは何ですか?
これまでの私の考え:
Popen.wait()生成されたプロセスごとにスレッドを呼び出して、終了時に自動クリーンアップを実行します。
PRO : すぐにクリーンアップします。スレッドはスリープ状態にあるため、おそらく CPU パワーをあまり消費しませんよね?
CON : スポーン アクティビティに依存する多くのスレッド。- スレッドを使用
Popen.poll()して既存のすべてのプロセスを呼び出しreturncode、それらが終了しているかどうかを確認し、その場合はクリーンアップします。
PRO : すべてのプロセスに対してワーカー スレッドが 1 つだけで、メモリ使用量が少なくなります。
CON : 定期的なポーリングが必要です。実行時間の長いプロセスが多数ある場合、または多数のプロセスが生成された場合は、CPU 使用率が高くなります。
あなたはどちらを選びますか?なぜですか?またはより良い解決策はありますか?