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)
我已经测试了上面的方法在微不足道的情况下的工作情况,但我不确定它处理任何错误的能力如何。
我有以下代码
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)
我已经测试了上面的方法在微不足道的情况下的工作情况,但我不确定它处理任何错误的能力如何。