Gearmanインストール、Rubyから使う

参考 http://d.hatena.ne.jp/okinaka/20090823/1251036470

sudo apt-get install gearman-server


/etc/default/gearman-server を編集、trueにする

ENABLED="true"
sudo /etc/init.d/gearman-server start

最近のバージョンのgearmanはport 4300で動くらしいが、aptで入ったのは7003だった。



githubruby用のライブラリがあった http://github.com/xing/gearman-ruby
gemでインストール

sudo gem sources -a http://gems.github.com
sudo gem install xing-gearman-ruby

使ってみる。

  • clientがURLをdownloadタスクとして登録する
  • workerがダウンロードする
  • workerを複数起動しておくと、workerの数だけ同時にダウンロードできるようになる

gearman-serverと同じマシンで動かすworker
download-worker.rb

require 'rubygems'
require 'gearman'

#Gearman::Util.debug = true
w = Gearman::Worker.new(['localhost:7003'])
w.add_ability('download'){|url,job|
  puts `/usr/bin/wget #{url}` # ダウンロード
  true # 完了したのを報告
}

while true do
  w.work
end

falseを返すと、タスクが失敗したのを通知できる。client側ではon_failで受け取る。


別のマシンからgearman-serverに接続して、downloadタスクを登録する
download-client.rb

#!/usr/bin/env ruby
require 'rubygems'
require 'gearman'

c = Gearman::Client.new(['192.168.1.103:7003'])
taskset = Gearman::TaskSet.new(c)

ARGV.each{|url|
  puts "add task #{url}"
  task_dl = Gearman::Task.new('download', url)
  task_dl.on_complete{|stat|
    puts "#{stat} #{url}"
  }
  taskset.add_task(task_dl)
}
taskset.wait(100) # 100sec

taskset.wait(秒数)をすると、自分がadd_taskしたタスクが全部終了するまで待機する。
waitしなかったり、waitの秒数を越えたり、client.rbを強制終了するとタスクが削除される。


&をつけてworkerを複数起動しておく

ruby download-worker.rb &


download taskを4つ登録

ruby download-client.rb http://example.com/1.jpg http://example.com/2.jpg http://example.com/3.jpg http://example.com/4.jpg
add task http://example.com/1.jpg
add task http://example.com/2.jpg
add task http://example.com/3.jpg
add task http://example.com/4.jpg
true http://example.com/2.jpg
true http://example.com/3.jpg
true http://example.com/1.jpg
true http://example.com/4.jpg

登録した順ではなく、完了した順に報告が返ってくる