从多个红宝石叉子返回

时间:2015-05-04 12:06:24

标签: ruby concurrency return fork

我有以下代码

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)

适用于一个fork,但我显然希望实现并发性,因此我需要从所有分支中获取count哈希值。但是到目前为止,我只能从任一个分支中检索一个哈希值。我怎样才能归还所有这些?

1 个答案:

答案 0 :(得分:1)

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

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

编辑:

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

或者,您可以添加填充/标记,如下所示:

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)

我已经测试了上述内容以便在琐碎的情况下工作,但我不确定它能解决任何出错的问题。