使用`sleep`使管道无法正常工作

时间:2015-01-29 17:49:03

标签: ruby pipeline

我有这个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,那么我什么也看不见。如果我在sleep 0.1内注释oprint,那么我会看到很多输出。 sleep会破坏管道吗?有修复吗?

1 个答案:

答案 0 :(得分:1)

oprint | echo确实不应该工作,因为echo不会从输入流中读取。它回应了它的论点。如果您想测试一个简单的管道,oprint | cat会更合适。

即使这样,当你有一个像这样的无限循环时,你应该在$stdout.flush之后添加puts。由于许多小IO调用可能是性能瓶颈,因此默认情况下Ruby会缓冲其输出 - 这意味着它会在缓冲区中存储大量的小输出,然后一次性写入整个缓冲区。手动刷新缓冲区可确保它不会永远等待实际写入。

进行这两项更改可以获得预期的输出。