Ruby while 循环睡眠

Ruby while loop with sleep

给出以下 ruby:

$i = 0
$num = 3

while $i < $num  do
    puts "My loop just executed"
    sleep 10
    $i +=1
end

我希望每 10 秒(加上执行时间)我就会将 "My loop just executed" 打印到我的控制台,直到 $i = 3

My loop just executed
# sleeps for 10 seconds
My loop just executed
# sleeps for 10 seconds
My loop just executed
# sleeps for 10 seconds

但是实际发生的是脚本运行,直到 $i = 3 才向控制台打印任何内容,然后我一次打印了 3 行:

My loop just executed
My loop just executed
My loop just executed

我不明白为什么它不会在每个循环后打印而不是在最后打印所有内容?

为什么会这样,我怎样才能让它像我期望的那样工作?任何帮助将不胜感激

控制台输出已缓冲,没有人答应为您IO#flush

$i = 0
$num = 3

while $i < $num  do
    $stdout.puts "My loop just executed"
    $stdout.flush
    sleep 10
    $i +=1
end

Ruby 如果 stdout 是终端设备 (tty),则自动刷新输出,如果不是,则缓冲输出。

例如,运行 终端通常会立即输出 "hello":

$ ruby -e 'puts "hello" ; sleep 5 ; puts "world"'
hello
# 5 seconds delay
world
$

因为:

$ ruby -e 'puts $stdout.tty?'
true

而将输出通过管道传输到另一个命令通常会延迟(即缓冲)输出,直到脚本完成:

$ ruby -e 'puts "hello" ; sleep 5 ; puts "world"' | cat
# 5 seconds delay
hello
world
$

因为:

$ ruby -e 'puts $stdout.tty?' | cat
false

无论 stdout 是否为 tty,要立即刷新任何输出,您可以在脚本开头将 $stdoutsync 设置为 true

$stdout.sync = true

应用于上面的例子:

$ ruby -e '$stdout.sync = true ; puts "hello" ; sleep 5 ; puts "world"' | cat
hello
# 5 seconds delay
world
$