理系学生日記

おまえはいつまで学生気分なのか

Gearman クライアント側

とりあえず動いてはいるんだけど、Gearman::Task への scalarref の渡し方ってもっとキレいなかんじになるんじゃないかっていう感じする。

my $client;

sub _setup_client {
    my ($servers) = @_;

    $client ||= Gearman::Client->new( job_servers => $servers );;
    return $client;
}

sub download :Local {
    my ($self, $c, $videoid ) = @_;

    my $server = $c->config->{myapp}->{gearman}->{server};
    $c->log->info("server: $server");

    my $client = _setup_client([$server]);
    my $freeze = freeze(\$videoid);
    
    my $task   = Gearman::Task->new( 'download', \$freeze, {
        uniq        => 1,
        on_complete => sub { $c->log->info("task for $videoid completes."); },
        on_fail     => sub { $c->log->error("task for $videoid fails."); },
    });
    $client->dispatch_background($task);
}