【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