Return 来自多个 ruby 分支

Return from multiple ruby forks

我有以下代码

read, write = IO.pipe
count = {}
ARGV.each do |filename|
    fork do
        read.close
        write.write Marshal.dump(do_stuff(filename))
        write.close
    end
end
write.close
count = Marshal.load(read.read)
read.close
Process.waitall

printf(count)

这适用于一个分叉,但我显然想实现并发,所以我需要从所有分叉中获取 count 哈希。但是到目前为止,我只能从其中一个分叉中检索到一个散列。我怎样才能 return 所有这些?

Marshal.load 只会加载第一个转储,而忽略其余的。例如:

Marshal.load(Marshal.dump("one") + Marshal.dump("two"))     #=> "one"

编辑:

要解决此问题,您可以直接写入数据,而不是使用 Marshal.dump。效果如何取决于您尝试发送的数据。

或者,您可以添加 padding/markers,如下所示:

io_in, io_out = IO.pipe
ARGV.each do |filename|
  fork do
    io_in.close
    data = filename
    io_out.write(Marshal.dump(data) + "::::")
    io_out.close
  end
end
io_out.close

data = io_in.read
io_in.close

data = data.split("::::").map {|it| Marshal.load(it) }

Process.waitall

p(data)

我已经测试了上面的方法在微不足道的情况下的工作情况,但我不确定它处理任何错误的能力如何。