2010年1月20日水曜日

MacでWorkerManager(for TheSchwartz)のサンプルを動かしてみた

スズキです。

MacでTheSchwartzネタ、再び、です。
http://blog.suz-lab.com/2010/01/mactheschwartz.html

今回は、こちらで紹介されているWorkerManagerを利用してみます。
http://d.hatena.ne.jp/stanaka/20091023/1256252946

とりあえず、下記から、一式ダウンロードします。
http://github.com/stanaka/WorkerManager
(右上の"Download Source"から取得できます)

展開すると、こんな感じになると思います。

README
bin/
config/
examples/
lib/
script/

ここで下記のように、必要なCPANモジュール一式をインストールします。

$ sudo cpan Proc::Daemon
$ sudo cpan File::Pid
$ sudo cpan YAML::Syck
$ sudo cpan Parallel::ForkManager
$ sudo cpan UNIVERSAL::require
$ sudo cpan Time::Piece
$ sudo cpan TheSchwartz::Simple

この状態で、"workermanager.pl"を実行すると、
エラーが無い状態でusageが表示されることが確認できます。

$ ./bin/workermanager.pl

usage: ./bin/workermanager.pl [-hdn] [-c concurrency] [-w
works_per_child] -f conf_file

-h : this (help) message
-d : debug
-n : prevent deamonize (non fork)
-c : the number of concurrency (default 4).
-w : the number of works per child process (default 100).
-f : YAML-formated file of configuration

準備が整ったら、次は、いよいよ、exampleを動かしてみます。

まず、"examples/bin/worker.conf.yml"に下記のように、DBの情報を記述します。

--------【worker.conf.yml】--------
workers:
 - Sandbox::Worker::A
 - Sandbox::Worker::B
worker_options:
 prioritize: 1
 databases:
  dsn: dbi:mysql:theschwartz
  user: theschwartz
  pass: xxxxxxxx
inc_path:
 - examples/lib
pidfile: examples/run/workermanager.pid
logfile: examples/log/workermanager.log
errorlogfile: examples/log/workermanager_error.log
--------

そして、"workermanager.pl"を以下のように実行します。

$ ./bin/workermanager.pl -n -d -f examples/bin/worker.conf.yml
2010-01-20T01:09:01 WorkerManager 0 started with PID 35247
2010-01-20T01:09:01 WorkerManager 1 started with PID 35248
2010-01-20T01:09:01 WorkerManager 2 started with PID 35249
2010-01-20T01:09:01 WorkerManager 3 started with PID 35250

これで、Workerが待ちうけ状態になったので、最後にClientです。

まあ、"examples/bin/client.pl"を実行するのですが、
以下のようにDBの接続情報も記述するようにします。

--------【client.pl】--------
#!/usr/bin/env perl

use strict;
use warnings;

use FindBin;
use lib File::Spec->catdir($FindBin::Bin, '..', 'lib');
use lib File::Spec->catdir($FindBin::Bin, '..', '..', 'lib');

use WorkerManager::Client::TheSchwartz;
use Time::Piece;

my $client = WorkerManager::Client::TheSchwartz->new({
  "dsn" => "dbi:mysql:theschwartz",
  "user" => "theschwartz",
  "pass" => "xxxxxxxx"
});

$client->insert('Sandbox::Worker::A' => +{foo => localtime->epoch});
$client->insert('Sandbox::Worker::B' => +{foo => localtime->epoch},
{run_after => time, priority => 1});
$client->insert('Sandbox::Worker::B' => +{foo => localtime->epoch},
{run_after => time + 30});
$client->insert('Sandbox::Worker::B' => +{foo => localtime->epoch},
{run_after => time + 60});
--------

ちなみに、"lib/WorkerManager/Client/TheSchwartz.pm"の、
おそらく"dsn"のスペルが"dns"になっていたので、修正しておきました。

この状態で、下記のように実行すると、Workerが待ちうけ中のコンソールに、
いろいろと、処理内容が出力されるはずです。

$ ./examples/bin/client.pl

だんだん、TheSchwartzが、自分のものになってきたぞ!

--------
http://www.suz-lab.com

0 コメント: