同時実行数を制限するため Queue や SizedQueue が使えそうだ。でもスレッドとか排他ロックに不慣れなので本や Web の解説を読んでも今ひとつピンとこない。試しに Queue の定義を覗いて見ると肝心な部分はほんの 30 行程度であった。
落ち込んだ... クールすぎて。
ruby-1.9.2p0 の thread.rb より一部(のメッソッド)抜粋。
class Queue # # Creates a new queue. # def initialize @que = [] @waiting = [] @que.taint # enable tainted comunication @waiting.taint self.taint @mutex = Mutex.new end # # Pushes +obj+ to the queue. # def push(obj) @mutex.synchronize{ @que.push obj begin t = @waiting.shift t.wakeup if t rescue ThreadError retry end } end # # Retrieves data from the queue. If the queue is empty, the calling thread is # suspended until data is pushed onto the queue. If +non_block+ is true, the # thread isn't suspended, and an exception is raised. # def pop(non_block=false) @mutex.synchronize{ while true if @que.empty? raise ThreadError, "queue empty" if non_block @waiting.push Thread.current @mutex.sleep else return @que.shift end end } end end
0 件のコメント:
コメントを投稿