ワークパイル(Work pile)は、並列処理の為のアルゴリズムの一種です。

lucille 開発日記: マルチスレッド化: ワークパイル

簡単に云ってしまえば、ワークパイルはサーバ/クライアント機構と似たようなもので、ジョブを処理するスレッド部分ではマスタースレッドから仕事(ジョブ)を受け取って処理し、仕事がなくなるまでループするというものです。

いわゆる生産者消費者問題を解決する手法の一つですね。 ちょっとサンプルコードを見てもらったほうがはやいかも。

workpile.rb

   1  require 'thread'
   2  
   3  class Workpile
   4    def initialize(num_workers)
   5      @queue = Queue.new
   6      @workers = ThreadGroup.new
   7  
   8      # Spawn worker threads
   9      num_workers.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は同期の面倒を見てくれるので、何も考えずにpushpopでタスクのやり取りを行うことができてしまいます。 しかも、キューが空になったらカレントスレッドを停止するように なってるんですね。

並列処理というとC/C++でCriticalSectionやmutexのネイティブAPIを さわるようなのばかりだったので、こんなに簡潔に記述できるのは 良いですね。やはりインターフェイス重要だな。

クリスマスに出る(という噂の)Ruby 1.9でネイティブスレッド化されたら、 もっと楽しいかもしれませんねー。

posted by Png genki on Fri 7 Dec 2007 at 06:14

Comments:

or Preview
Social Bookmarks
  • Delicious
  • B_entry245
  • Clip_16_12_w
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ