1

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 使用率が高くなります。

あなたはどちらを選びますか?なぜですか?またはより良い解決策はありますか?

4

1 に答える 1