2016-07-18 11 views
0

子プロセスからのデータを生成してファイルに書き込むために、以下のコードを読んでいます。pythonサブプロセスパイプバッファリングされていない動作

 
from subprocess import Popen, PIPE 
proc = Popen('..some_shell_command..', shell=True, stdout=PIPE) 
fd = open("/tmp/procout", "wb") 
while True: 
    data = proc.stdout.read(1024) 
    if len(data) == 0: 
     break 
    fd.write(data) 
fd.close() 

'Popen'のデフォルトのbufsizeは、0 =>バッファなしです。なんらかの理由でファイルへの書き込み操作に大きな遅延が発生した場合はどうなりますか?

  • 子プロセスが500GBのデータを生成すると仮定すると、すべてのデータは親がそれらをすべて読み取るまでメモリに格納されますか? (OR)
  • 子プロセスは、次の1024バイトをstdoutに書き込む前に、1024バイトのデータが親によって読み込まれるのを待ちますか? (OR)
  • OSパイプバッファがいっぱいになった後に子プロセスが待機し、親プロセスが読み込まれると、子プロセスは再び書き込みを再開しますか? (OR)
  • ??ご質問に答える

答えて

1

  • をいいえ、それはメモリに格納されることはありません。子プロセスは、pipe-max-sizeの制限(cat/proc/sys/fs/pipe-max-size)を超えた後に、write操作でスタックします。
  • 親プロセスがデータのブロックを読み取るまで、子プロセスはスタックする前に約1Mを書き込みます。この子プロセスの後に、次の1024バイトが順番に読み込まれるほど速く書き込まれます。
  • はいIOをブロックする場合、writeシステムコールが呼び出されると、OSによってブロックされます。ノンブロッキングIOの場合、write syscallはEAGAINやその他のシステム固有のエラーを返します。

実際には、writeをコールしている間にアプリケーションが停止し、パイプバッファが使用可能になるのを待っています。それがハングすることを意味するものではありません。たとえば、アプリケーションが何らかの種類の内部待ち行列を実装していて、複数のスレッドを持っている場合は、書き込みスレッドがバッファを待機している間、処理を継続してデータをその待ち行列に追加できます。

関連する問題