use strict; use warnings; use MCE::Flow; my $N; # Workers receive [ begin, end ] values. MCE::Flow::init( max_workers => MCE::Util::get_ncpu(), chunk_size => 100000, bounds_only => 1, user_begin => sub { $N = MCE->user_args()->[0] } ); sub func { my ( $beg_seq, $end_seq ) = @{ $_ }; my ( $pi, $t ) = ( 0.0 ); for my $i ( $beg_seq .. $end_seq ) { $t = ( $i + 0.5 ) / $N; $pi += 4.0 / ( 1.0 + $t * $t ); } MCE->gather($pi); } # The user_args option is how to pass arguments. # Workers persist between each run. for my $e ( 1..8 ) { my $n = 10 ** $e; my @ret = mce_flow_s { user_args => [$n] }, \&func, 0, $n - 1; my $pi = 0.0; $pi += $_ for @ret; printf "%9d %0.14f\n", $n, $pi / $n; }