tokuhirom's Blog

Local map-reducing by Parallel::ForkManager

use strict;
use warnings;
use utf8;
use 5.010000;
use Array::Split qw/split_by/;
use Parallel::ForkManager;
use List::Util qw/sum/;

my $WORKER_NUM = 10;
my $SPLIT_NUM  = 1000;

my @data = 1..10000;
my @data_ary = split_by($SPLIT_NUM);

my $pm = Parallel::ForkManager->new($WORKER_NUM);
my $total_result;
$pm->run_on_finish(
    sub {
        my ($pid, $exit_code, $ident, $exit_signal, $core_dump, $data) = @_;
        $total_result += $$data;
    }
);
for my $set (split_by($SPLIT_NUM, @data)) {
    my $pid = $pm->start and next;

    my $result = sum map { sin $_ } @$set;
    say "Result of $$: $result";

    $pm->finish(0, \$result);
}
$pm->wait_all_children();

say "Result: $total_result";

ref.
http://blog.livedoor.jp/xaicron/archives/53557385.html