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 使用率が高くなります。
あなたはどちらを選びますか?なぜですか?またはより良い解決策はありますか?