とりあえず動いてはいるんだけど、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); }