RubyでProcess Pool

Programming Ruby

Summary

RubyでProcess Poolを簡単に作れるクラスを書いてみました。Ruby歴は浅いのでアホな書き方をしているかもしれません。ツッコミ歓迎。

Motivation

Rubyは1.9からNative Threadにはなったんですが、GVLがあって結局コア数でスケールしないし、Multi Processで速度をかせぐライブラリがもっとあってもよさそうなんですが、あまり見つからないので自分で書くことに。

(組み込みライブラリはGVLを解放するものがあるそうなんですが、gemにあるのは対応していないものが多いような)

grosser/parallel はあるんですが、配列の並行処理に機能を絞っているので用途に合わなかったのです。がっつり一枚岩で外部から触りにくいので、もう少し細かい要素に分けてほしいところですね。

Usage

使い方はこんな感じです

require 'process_pool'

class MyWorker < ProcessPool::Worker
  def initialize
  end

  def work(item)
    puts item
  end
end

pool = ProcessPool.new(8, worker_class:MyWorker)
pool.start
100.times do |n|
  pool.enqueue n
end
pool.wait

while

pool.stop
  • ProcessPool::Workerの子クラスを作成
    • workで処理内容を実装
  • newで子プロセス生成
    • 引数は子プロセス数とワーカークラス
  • startで処理を開始
  • enqueueは処理待ちキューにデータを投入
    • このデータがworkに渡される
  • waitはキューが空になるまで待つ
  • stopは子プロセスをkill

Misc

一応ワーカーが返してきた結果を取得できるようにしてあるんですが、順番は保存されません

Code

Comments