Parallel::ForkManager のサンプル

#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Long;
use Parallel::ForkManager;

GetOptions(
    'h|help'      => \my $help,
    'p|process=i' => \my $process,
    'verbose'     => \my $verbose,
) or pod2usage();

pod2usage() if $help;

my $pm = Parallel::ForkManager->new($process || 1);

my $result = {};

# 子プロセスが終了する際に呼ばれるサブルーチンを定義する
# これは親プロセスから呼ばる
$pm->run_on_finish(
    sub {
        my ($pid, $exit_code, $ident, $exit_signal, $core_dump, $data) = @_;

        if (defined $data) {
            $result->{$pid} = $$data;
        }
    }
);

for my $id (0..10) {
    my $pid = $pm->start and next;

    # write codes to do something;

    $pm->finish(0, \"finished $id");
}

$pm->wait_all_children;

use Data::Dumper;
warn Dumper($result);