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
Published: 2012-10-18(Thu) 05:28