我有以下代码
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
哈希值。但是到目前为止,我只能从任一个分支中检索一个哈希值。我怎样才能归还所有这些?
答案 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)
我已经测试了上述内容以便在琐碎的情况下工作,但我不确定它能解决任何出错的问题。