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,要立即刷新任何输出,您可以在脚本开头将 $stdout
的 sync
设置为 true
:
$stdout.sync = true
应用于上面的例子:
$ ruby -e '$stdout.sync = true ; puts "hello" ; sleep 5 ; puts "world"' | cat
hello
# 5 seconds delay
world
$
给出以下 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,要立即刷新任何输出,您可以在脚本开头将 $stdout
的 sync
设置为 true
:
$stdout.sync = true
应用于上面的例子:
$ ruby -e '$stdout.sync = true ; puts "hello" ; sleep 5 ; puts "world"' | cat
hello
# 5 seconds delay
world
$