ruby - 使用 `sleep` 使管道无法工作

标签 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,那么我什么也看不到。如果我在 oprint 中注释掉 sleep 0.1,那么我会看到很多输出。 sleep 会破坏管道吗?有解决办法吗?

最佳答案

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

即便如此,当您遇到这样的无限循环时,您也应该在 puts 之后添加 $stdout.flush。由于大量小的 IO 调用可能成为性能瓶颈,Ruby 默认缓冲其输出 - 这意味着它将大量小输出存储在缓冲区中,然后一次写入整个缓冲区。手动刷新缓冲区可确保它不会永远等待进行实际写入。

进行这两项更改会得到预期的输出。

关于ruby - 使用 `sleep` 使管道无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28221267/

相关文章:

ruby - HTTParty parsed_response 返回一个 String 而不是 Hash

mysql - 如何使用Rails手动连接MYSQL数据库?

OpenCL 2.x 管道 - 它们实际上是如何工作的?

user-interface - airflow - 如何将 web ui TreeView 上的时间设置为 UTC?

ruby - 将几个 Enumerables 变成一个

ruby 调试器直接进入一个 block ?

ruby - 试图在 case 语句中引用更早的 'case'

powershell - 枚举大型powershell对象变量(100万以上成员)

docker - Kubeflow管道错误:无法保存输出:没有这样的容器

workflow - 使用 Apache Airflow 建模扇出工作流程