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だった。
githubにruby用のライブラリがあった 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
登録した順ではなく、完了した順に報告が返ってくる