tokuhirom's Blog

それ Proc::Guard 0.04 でできるよっていう話

http://d.hatena.ne.jp/antipop/20101130/1291112500

Proc::Guard をつかってこういう風にするのはどうか。$worker_guard ってのが Scope::Guard あるいは AnyEvent の guard みたいなかんじになってます。スコープをぬけるときに、自動的にプロセスを kill した上で wait して、ゾンビプロセスをのこさない設計になっています。

proc_guard(sub { }) の中は、子プロセスの中でうごくっていうのがキモですね。

use strict;
use warnings;
use Test::TCP;
use Test::More;
use Proc::Guard 0.04 qw/proc_guard/;

use Gearman::Worker;
use Gearman::Client;

test_tcp(
    client => sub {
        my $port = shift;

        my $worker_guard = proc_guard(sub {
            my $worker = Gearman::Worker->new;
            $worker->job_servers("127.0.0.1:$port");
            # 例のため適当なsubrefを登録しているが、実際には、
            # テストを行うfunctionをregisterする
            $worker->register_function(test => sub { 1 });
            $worker->work while 1;
        });

        my $client = Gearman::Client->new;
        $client->job_servers("127.0.0.1:$port");
        my $result = $client->do_task('test');
        is $$result, 1;
    },
    server => sub {
        my $port = shift;
        exec 'gearmand', '-p', $port;
    }
);

done_testing;