せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】Queueを使った並列プログラミング

 

ポイント(?)

スレッド間で変数へのアクセスが共有できるっていうことは以前勉強したところ。
Queueクラスのインスタンスでなくても当然共有出来る。
じゃあQueueクラスは何が特別なのかというと、

Queueには、キューが空ならdeqメソッドが呼び出し元をブロックするという並列プログラミングに特に適した特徴がある

という点。
なるほど。

 

require 'thread'
module Enumerable
  def conject(initial, mapper, injector)
    que = Queue.new
    count = 0
    self.each do |item|
      Thread.new do
        que.enq(mapper.call(item))
      end
      count += 1
    end
    result = initial
    while count>0
      result = injector.call(result, que.deq)#<= 必要に応じて待つ
      count -= 1
    end
    result
  end
end
a=[-2, -1, 0, 1, 2]
mapper = lambda{|x| sleep(1); x*x}
injector = lambda{|total, x| total+x}
p a.conject(0, mapper, injector)

 
■実行結果

10