RubyでいっぱいProcを渡しても、スレッドをつくりすぎないようにちょっとずつ並列実行してくれるヤツ

2011/12/10昼ごろ追記
つか、これじゃダメっぽい。実行されずに終わるスレッドがたまにある。joinの実装?

2011/12/10 18:45 join修正した

2011/12/10 20:40 callのところに例外処理

2011/12/12 Procじゃなくてblockに変更してみた


名前がイケてない

class ThreadCommander
  require 'thread'

  def initialize size = 50
    @q = SizedQueue.new size
    @ts = {}
  end

  def push &block
    @q.push block.object_id
    t = Thread.start do
     begin
      yield
     rescue Exception => e
       #なんか例外処理
     end
     @q.pop
    end
    @ts[:t.object_id] = t
  end
  
  def join
    while !@q.empty?
      @ts.each do |k, v|
        v.join
        @ts.delete(k)
      end
      Thread.pass
    end
  end

end

tq = ThreadCommander.new 10
puts "start."
(1..100).to_a.each do |i|
  tq.push {sleep rand; puts i}
  puts "."
end
puts "running."
tq.join
puts "end."