1

请帮帮我

我如何为像地图一样的数组实现方法 pmap 但在两个过程中

我有代码

class Array

  def pmap
    out = []
    each do |e|
      out << yield(e)
    end
    out
  end

end

require 'benchmark'

seconds = Benchmark.realtime do
  [1, 2, 3].pmap do |x|
    sleep x
    puts x**x
  end
end

puts "work #{seconds} seconds"

结果我必须得到 3 秒的基准测试

4

2 回答 2

3

获得绝对 2 个叉子

你并不绝对需要 RPC。Marshal + Pipe 通常应该可以工作。

class Array

  def pmap
    first, last = self[0..(self.length/2)], self[(self.length/2+1)..-1]

    pipes = [first, last].map do |array|
      read, write = IO.pipe
      fork do
        read.close
        message = []
        array.each do |item|
          message << yield(item)
        end
        write.write(Marshal.dump message)
        write.close
      end
      write.close
      read
    end

    Process.waitall

    first_out, last_out = pipes.map do |read|
      Marshal.load(read.read)
    end

    first_out + last_out
  end

end

编辑

现在使用叉子

于 2013-04-15T18:51:46.913 回答
3

试试平行宝石。

require 'parallel'

class Array
  def pmap(&blk)
    Parallel.map(self, {:in_processes: 3}, &blk)
  end
end
于 2013-04-15T21:13:15.847 回答