スレッド管理をするために、少しだけCelluloidを触ってみた。
IO周りの非同期処理、Fault-toleranceをうまい具合にやってくれる。スレッドが死んでしまった場合でも監視しているので、自動でスレッドを生成してくれる。
celluloid.rb
class Supervisor
def initialize
@supervisor = Celluloid::SupervisionGroup.run!
@supervisor.pool(Worker, as: :worker, size: 2)
end
def run
loop do
@supervisor[:worker].process
end
end
end
class Worker
include Celluloid
def process
puts "do something!!"
end
end
SupervisionGroup でスレッドをグループ化して管理する。グループ化することでスレッドの起動と停止をグループごとに行うことができる。
詳細は公式ドキュメントを参照。
@supervisor.pool(Worker, as: :worker, size: 2)
ではグループのPoolにWorkerクラス(実際に処理をさせるクラス)を指定して、as: :worker
で worker という名前で定義する。size:
で同時に生成するスレッド数を指定する。
あとは@supervisor[:worker].process
で Worker#process を実行する。
Message Queuingで使ってみた感想としては、単純なスレッドの生成(Threadを使った)より並列処理の速度は落ちてしまうようです。