如何立即打印标准输出



如何立即输出stdout ?stdout将在所有输入完成后打印。

require 'open3'
def run(cmd)
    Open3.popen3(cmd) do |stdin, stdout, stderr, thread|
    Thread.new do
      stdout.each {|l| puts l}
    end
    Thread.new do
      while thread.alive?
        stdin.puts $stdin.gets
      end
    end
    thread.join
  end
end
run ("ruby file_to_test.rb")

file_to_test.rb:

puts "please, enter s"
puts "please, enter q"
s = gets.chomp!
q = gets.chomp!
puts s
puts q

运行main后的结果。rb:

somestring
somestring2
please, enter s
please, enter q
somestring
somestring2

如何立即输出stdout ?

Ruby正在缓冲输出,直到输出缓冲区已满。要更改行为,使其自动写入使用syncsync=:

old_sync = $stdout.sync
$stdout.sync = true
puts "immediately output lotsa stuff"
puts "immediately output lotsa stuff"
puts "immediately output lotsa stuff"
puts "immediately output lotsa stuff"
# reenable the default behavior
$stdout.sync = old_sync

来自sync=的文档:

设置"同步模式"为true或false。当同步模式为true时,所有输出将立即刷新到底层操作系统,而不会在内部进行缓冲。

重要的是要理解启用自动刷新缓冲区实际上会降低代码的整体执行速度,特别是当您正在写入希望以块形式接收其数据的文件或设备时。使用sync或冲洗时要小心。

刷新输出

您要查找的是使用flush方法刷新io流。

在每次迭代或每次放置之后尝试以下操作:

stdout.flush

如果您在一行中有多个看跌期权,我建议在最后一个看跌期权之后执行flush,这样您就不会太频繁地执行该操作。例子:

stdout.puts "Hello"
stdout.puts "Mate"
stdout.flush

最新更新