gpt4 book ai didi

Ruby:从 Windows 上的外部进程的 stdout 和 stderr 读取大数据

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

大家好

我需要在 Windows 上从 Ruby 1.9.2 运行一个可能长时间运行的进程,然后从外部进程的标准输出和错误中捕获和解析数据。可以向每个发送大量数据,但我一次只对一行感兴趣(不捕获和存储整个输出)。

经过一些研究,我发现 Open3 class会负责执行流程并给我 IO连接到进程的标准输出和错误的对象(通过 popen3 )。

Open3.popen3("external-program.bat") do |stdin, out, err, thread|
# Step3.profit() ?
end

但是,我不确定如何在不阻塞程序的情况下连续读取两个流。由于在发送大量数据时在 outerr 上调用 IO#readlines 会导致内存分配错误,因此我正在尝试持续检查两个流的可用输入,但我的任何实现都不太顺利。

提前感谢您的任何建议!

最佳答案

经过多次不同的尝试和错误尝试,我最终想到了使用两个线程,一个线程从每个流中读取(generator.rb 只是我编写的一个脚本,用于将内容输出为标准出错误):

require 'open3'

data = {}

Open3.popen3("ruby generator.rb") do |stdin, out, err, external|
# Create a thread to read from each stream
{ :out => out, :err => err }.each do |key, stream|
Thread.new do
until (line = stream.gets).nil? do
data[key] = line
end
end
end

# Don't exit until the external process is done
external.join
end

puts data[:out]
puts data[:err]

它只是输出调用程序发送到标准输出的最后一行和错误,但显然可以扩展以进行额外的处理(每个线程中具有不同的逻辑)。我在 之前使用的一种方法最终想出了这个方法,但由于竞争条件导致了一些失败;我不知道这段代码是否仍然存在漏洞,但我还没有经历过类似的失败。

关于Ruby:从 Windows 上的外部进程的 stdout 和 stderr 读取大数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4661434/

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