AnyEvent::MPRPCでMessagePack RPC
MessagePack RPCは全てのメッセージにシーケンス番号をいれることで、1つのTCP接続でpipeliningのような遅延リターンができる。
Gearmanでやりたかったいめーじはこちらのほうがちかい。
server側
use AnyEvent; use AnyEvent::MPRPC::Server; my $server = AnyEvent::MPRPC::Server->new( port => 4423 ); $server->reg_cb( 'sleep' => sub { my ( $res_cv, $sleep ) = @_; warn $sleep; my $t; $t = AE::timer $sleep, 0 , sub { undef $t; $res_cv->result("$sleep done!"); }; }, ); AE::cv->recv;
client側
my $work_count = 0; my @sleeps = qw/1 5 2 4 3 2 1/; my $worked = 0; my $client = AnyEvent::MPRPC::Client->new( host => '127.0.0.1', port => 4423, ); for my $sleep ( @sleeps ) { my $n = $work_count++; $client->call( 'sleep' => $sleep )->cb( sub { my $res = shift->recv; warn "$n: $sleep: $res"; $worked++; }); }; my $w; $w = AnyEvent->timer( after => 0, interval => 1, cb => sub { if ($worked == @sleeps) { exit; } } ); AE::cv->recv;
実行結果
% perl anyevent_mprpc_client.pl0: 1: 1 done! at anyevent_mprpc_client.pl line 20. 6: 1: 1 done! at anyevent_mprpc_client.pl line 20. 2: 2: 2 done! at anyevent_mprpc_client.pl line 20. 5: 2: 2 done! at anyevent_mprpc_client.pl line 20. 4: 3: 3 done! at anyevent_mprpc_client.pl line 20. 3: 4: 4 done! at anyevent_mprpc_client.pl line 20. 1: 5: 5 done! at anyevent_mprpc_client.pl line 20.
created by blog.nomadscafe.jp
コメント
コメントはありません
コメントを投稿
コメントを投稿するにはログインが必要です