#!/usr/bin/env perl use strict; use warnings; use Math::BigInt; use Parallel::ForkManager; use Time::HiRes qw ( time ); use feature qw(say); use Iterator::Simple qw(iter); my @numbers = ( 1 .. 2000 ); my $processes = shift; my $tmp = q(/tmp/); my $pm = Parallel::ForkManager->new( $processes, $tmp ); my %data = map { $_ => undef } @numbers; say qq(numbers: ), scalar @numbers; say qq(processes: $processes); $pm->run_on_finish( sub { my ( $id, $result ) = ( $_[2], $_[5] ); $data{$id} = ${$result} } ); my $start=time; my $iterator = iter(\@numbers); while(defined( my $number = $iterator->())) { $pm->start($number) and next; my $factorial = Math::BigInt->bfac($number); $pm->finish( 0, \$factorial ); } $pm->wait_all_children; say qq(fork: ), time - $start; %data = map { $_ => undef } @numbers; $start = time; for my $number (@numbers) { my $factorial = Math::BigInt->bfac($number); $data{$number} = $factorial; } say qq(for: ), time - $start;