ワークパイル(Work pile)は、並列処理の為のアルゴリズムの一種です。
lucille 開発日記: マルチスレッド化: ワークパイル
簡単に云ってしまえば、ワークパイルはサーバ/クライアント機構と似たようなもので、ジョブを処理するスレッド部分ではマスタースレッドから仕事(ジョブ)を受け取って処理し、仕事がなくなるまでループするというものです。
いわゆる生産者消費者問題を解決する手法の一つですね。 ちょっとサンプルコードを見てもらったほうがはやいかも。
workpile.r
1 require 'thread' 2 3 class Workpile 4 def initialize(num_worker s) 5 @queue = Queue.new 6 @workers = ThreadGrou p.new 7 8 # Spawn worker threads 9 num_worker s.times do |i| 10 @workers.add(Thread.new do 11 puts "Worker #%d is ready." % i 12 loop do 13 @queue.pop.call # work 14 puts " (#%d)" % i 15 end 16 end) 17 end 18 end 19 20 def push_task(&block) 21 @queue.push block 22 @workers.list.sort_by{rand}.each{|worker| worker.run} # wake up! 23 end 24 25 def start 26 while input = gets.chomp 27 break if input == 'exit' 28 input.split('').each do |i| 29 push_task{print i} 30 end 31 end 32 end 33 end 34 35 Workpile.new(3).start
出力結果
1 % ruby workpile.rb 2 Worker #0 is ready. 3 Worker #1 is ready. 4 Worker #2 is ready. 5 hello! 6 h (#0) 7 e (#2) 8 l (#1) 9 l (#0) 10 o (#2) 11 ! (#0)
3つのワーカースレッドを作成して、投入したタスクを処理しています。
RubyのQueue
は同期の面倒を見てくれるので、何も考えずにpush
と
pop
でタスクのやり取りを行うことができてしまいます。
しかも、キューが空になったらカレントスレッドを停止するように
なってるんですね。
並列処理というとC/C++でCriticalSe
クリスマスに出る(という噂の)Ruby 1.9でネイティブスレッド化されたら、 もっと楽しいかもしれませんねー。
posted by
genki
on Fri 7 Dec 2007
at 06:14