gpt4 book ai didi

ruby - 从 STDOUT 流式传输数据

转载 作者:数据小太阳 更新时间:2023-10-29 07:15:26 27 4
gpt4 key购买 nike

所以我有以下代码:

阅读器.rb

require 'open4'

def streamer(stdout)
begin
loop do
data = stdout.read_nonblock(8)
print data
end
rescue Errno::EAGAIN
retry
rescue EOFError
puts 'End of file'
end
end
pid, stdin, stdout, stderr = Open4::popen4 "ruby threader.rb"
stdout.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
streamer(stdout)

线程.rb

10.times do
$stdout.puts "test"
sleep 1
end

一个 ruby​​ 脚本是一个简单的微调器,每秒都会输出到标准输出。

另一个用于运行该脚本,我想在数据进入时捕获数据。所以我希望流从 stdout 非阻塞读取。

我似乎无法让它工作。我想我正在正确设置 fctnl O_NONBLOCK 标志,但也许我没有。

最佳答案

您的代码运行良好。您只遗漏了一件事情,那就是刷新您的 threader 的输出缓冲区。

问题是 STDOUT 几乎总是被缓冲,在这种情况下,缓冲区不会被刷新,除非明确告知,直到线程退出。

这就是为什么读者看不到任何东西,然后当线程退出并且 STDOUT 被刷新时,它会突然得到一连串的输出。

所以这个测试的简单修复是:

10.times do
  $stdout.puts "test"
$stdout.flush
  sleep 1
end

但是请注意,因为您正在使用 NONBLOCK 阅读,您的阅读器将忙于循环(!)消耗 100% 的 CPU。要防止出现忙循环,您真正应该做的是在读取之前等待传入数据。

这可以通过 IO.select 来完成:

...
loop do
IO.select([stdout]) # <- waits for data (any data, even 1 byte)
data = stdout.read_nonblock(8)
print data
end
...

关于ruby - 从 STDOUT 流式传输数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10409140/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com