Pythonで実行時にオブジェクトのサイズを問い合わせるのと同様の質問がたくさんありました。いくつかの答えは、サブプロセスのメモリ量に制限を設定することを示唆しています。私はサブプロセスのメモリに制限を設定したくありません。ここに私が欲しいものがあります -Python - データサブプロセスの量を制限します.Popenで生成することができます
私はsubprocess.Popen()
を使って外部プログラムを実行しています。プロセスが完了した後で、標準出力とエラーをprocess.stdout.readlines()
とprocess.stderr.readlines()
で得ることができます。
エラーのあるプログラムが無限ループに入り、出力を生成し続けると、問題が発生します。 subprocess.Popen()
は出力データをメモリに格納するので、この無限ループはメモリ全体を素早く消費し、プログラムは遅くなります。
解決策の1つは、タイムアウトでコマンドを実行できることです。しかし、プログラムは完了するまでに時間がかかります。大きな時間切れは、小さな時間をかけて無限のループを持つプログラムでは、それを持つ目的を破る。
コマンドで生成できるデータの量に200MBという上限を置くことができる簡単な方法はありますか?限界を超えた場合、コマンドは強制終了されるべきです。
パイプバッファがいっぱいになると、子プロセスは遅くなるだけではありません。データを読むまで完全に停止します。複数のパイプを同時に読み取る必要がある場合は、スレッドまたは 'select'または' fcntl'モジュールを使用して、パイプをブロックせずに読み取ることができます。 – jfs