2011-08-30

rubyで出力のバッファリングをやめる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyで以下のような感じのコードを書きます。

print "xxx"
sleep 2
print "yyy"
sleep 2
print "zzz"

xxxと出てからyyyと出てzzzと出てくるのを期待したりするのですが、このように出力されないで
実際は、しばらく待って一気にxxxyyyzzzと出力されることになります。

これは標準出力する際に、バッファに一時的にためていてある程度たまってから出力しているせいなわけで
これを期待するように動かすには、
STDOUT.sync = true
print "xxx"
sleep 2
print "yyy"
sleep 2
print "zzz"

のように
STDOUT.sync = true
を追加すればOKです。

バッファリングされるのは標準出力だけでなく自分で書き込み用に作成したファイルへの書き込みでも同様な感じになります。
動作ログをファイルに取っている場合とかは、バッファリングせずにすぐに書き出してもらいたいわけです。
そんな時は、以下のような感じにファイルハンドラに
fw.sync = true
のような感じのものを追加すればOKです。
fw = File.open("eeee.txt",'w')
fw.sync = true
fw.puts 'aaa'
sleep 2
fw.puts 'bbb'
sleep 2
fw.puts 'ccc'
コメントを投稿