使用 `sleep` 使管道无法工作
Using `sleep` makes pipe to not work
我有这个 oprint
脚本:
#!/usr/bin/env ruby
amount = 100
index = 0
loop do
index += 1
if index % 5 == 0
amount += 10
end
sleep 0.1
$stdout.puts amount
end
如果我运行 oprint | echo
,那么我什么也看不到。如果我注释掉 oprint
中的 sleep 0.1
,那么我会看到很多输出。 sleep
会破坏管道吗?有修复吗?
oprint | echo
确实不应该工作,因为 echo
不从输入流中读取。它呼应了它的论点。如果你想测试一个简单的管道,oprint | cat
会更合适。
即便如此,当您遇到这样的无限循环时,您也应该在 puts
之后添加 $stdout.flush
。由于大量小型 IO 调用可能成为性能瓶颈,Ruby 默认情况下缓冲其输出 - 这意味着它将大量小输出存储在缓冲区中,然后一次写入整个缓冲区。手动刷新缓冲区可确保它不会永远等待进行实际写入。
进行这两项更改会得到预期的输出。
我有这个 oprint
脚本:
#!/usr/bin/env ruby
amount = 100
index = 0
loop do
index += 1
if index % 5 == 0
amount += 10
end
sleep 0.1
$stdout.puts amount
end
如果我运行 oprint | echo
,那么我什么也看不到。如果我注释掉 oprint
中的 sleep 0.1
,那么我会看到很多输出。 sleep
会破坏管道吗?有修复吗?
oprint | echo
确实不应该工作,因为 echo
不从输入流中读取。它呼应了它的论点。如果你想测试一个简单的管道,oprint | cat
会更合适。
即便如此,当您遇到这样的无限循环时,您也应该在 puts
之后添加 $stdout.flush
。由于大量小型 IO 调用可能成为性能瓶颈,Ruby 默认情况下缓冲其输出 - 这意味着它将大量小输出存储在缓冲区中,然后一次写入整个缓冲区。手动刷新缓冲区可确保它不会永远等待进行实际写入。
进行这两项更改会得到预期的输出。