AnyEvent::Gearman::Worker

ちょっと勘違いしていた。pipeliningのようなことができるわけじゃないから、1つの接続で

非同期に処理をしてくれるわけじゃない。


これは結果、普通のworkerとほぼ同じになる

use AnyEvent::Gearman::Worker;

my $worker = AnyEvent::Gearman::Worker->new(
    job_servers => ['127.0.0.1:4730'],
);
$worker->register_function(
    'sleep' => sub {
        my $job = shift;
        my $sleep = $job->workload;
        warn $sleep;
        my $t; $t = AnyEvent->timer(
            after => $sleep,
            cb    => sub {
                warn "$sleep done!";
                undef $t;
                $job->complete("$sleep done!");
            }
        );
    }
);
AE::cv->recv;

非同期/パラレルを狙うならこうする(力技

my @workers;
for ( 1 .. 4 ) {
    my $worker =
      AnyEvent::Gearman::Worker->new( job_servers => ['127.0.0.1:4730'], );
    push @workers, $worker;
    $worker->register_function(
        'sleep' => sub {
            my $job   = shift;
            my $sleep = $job->workload;
            warn $sleep;
            my $t;
            $t = AnyEvent->timer(
                after => $sleep,
                cb    => sub {
                    warn "$sleep done!";
                    undef $t;
                    $job->complete("$sleep done!");
                }
            );
        }
    );
}

AE::cv->recv;
created by blog.nomadscafe.jp

コメント

コメントはありません

コメントを投稿

コメントを投稿するにはログインが必要です