TheSchwartzでforkとモジュールの動的リロードを実装実験

http://code.google.com/p/themasartz/source/browse/#svn/branches/workerbase

ひとまず暫定で↑にコミットしてありますが、構成としては

/test_client.pl
/test_para_worker.pl
/test_worker.pl
/test_worker2.pl

/lib/MyApp/Async/Test.pm
/lib/MyApp/Async/Test2.pm

/lib/MyApp/Hoge.pm

/lib/TheSchwartz/Worker/Plugin/ModuleReload.pm
/lib/TheSchwartz/Worker/Plugin/Parallel.pm

こんな感じ。

上から順に。

・/test_client.pl
ジョブを突っ込むpl。2種類のジョブを投入
・/test_worker.pl
・/test_worker2.pl
1種類ずつのジョブを処理するworker。
一般的なTheschwartzのworkerで言うと、package main; に相当する部分。
・/test_para_worker.pl
後述するfork処理によって、これひとつで複数のジョブを処理します。


・/lib/MyApp/Async/Test.pm
・/lib/MyApp/Async/Test2.pm
それぞれ、test_worker.pl or test_worker2.plのジョブの実態。
一般例で言うところの、package Myworker;的なところにあたります。


・/lib/MyApp/Hoge.pm
でっちあげモジュール。
動的再読み込み試験用で、外部モジュールが都度読み込まれることを
返却値いじることで実験するため。


・/lib/TheSchwartz/Worker/Plugin/ModuleReload.pm
・/lib/TheSchwartz/Worker/Plugin/Parallel.pm
一応今回のメイン。
ModuleReload.pmはHTTP::Engine::Plugin::ModuleReloadをそのまま参考にしただけです><

Parallel.pmも基本Parallel::ForkManagerを使っただけだけど、
test_worker.plあたりでは、ジョブの実態pmをuseしていたけど、そこをこっち側で巻き取って、UNIVERSAL::requireで読み込ませています。


これで、実行すると以下のような結果になってほしい。。。

$VAR1 = {
$VAR1 = {
'hoge' => 'moge : 3'
};
MyApp::Async::Test aaa
'hoge' => 'fuga : 3'
};
MyApp::Async::Test2 aaa
$VAR1 = {
'hoge' => 'moge : 1'
};
MyApp::Async::Test aaa
$VAR1 = {
'hoge' => 'fuga : 4'
};
MyApp::Async::Test2 aaa
$VAR1 = {
$VAR1 = {
'hoge' => 'fuga : 5'
};
MyApp::Async::Test2 aaa
'hoge' => 'moge : 4'
};
MyApp::Async::Test aaa
$VAR1 = {
'hoge' => 'fuga : 1'
};
MyApp::Async::Test2 1226509002
$VAR1 = {
'hoge' => 'moge : 5'
};
MyApp::Async::Test 1226509002
$VAR1 = {
$VAR1 = {
'hoge' => 'moge : 2'
};
MyApp::Async::Test 1226509004
'hoge' => 'fuga : 2'
};
MyApp::Async::Test2 1226509004


残課題としては、
lib/TheSchwartz/Worker/Base.pm
を作って、ModuleReload.pmとParallel.pm
を抱えるようにもしたいです。

test_para_worker.plからは

my $para = TheSchwartz::Worker::Base->new();
$para->para_work( $client , \@jobs);


みたいな感じで呼べるように、
lib/MyApp/Async/Test.pm
では、

$self->reload();

みたいに再読み込みできるようにするとかでしょうか。。。


このBase.pm自体がTheSchwartz::Workerを継承する形になると
思うのに『Base』ってどうなんでしょう。。。