The "$pm->run_on_finish" method takes 2 additional arguments; signal_code and core_dump. I tried the following variation, based on ikegami's solution.
Parallel::ForkManager
use strict;
use warnings;
use Parallel::ForkManager qw( );
use Time::HiRes qw( time );
my @testLists = qw( sun moon wind air );
my $opts = 'foo';
my $status = 0;
sub regressions {
my ($opts, $list) = @_;
print "$$: $list\n";
sleep 1; # simulate processing
return 1;
}
my $start = time();
my $pm = Parallel::ForkManager->new( 2 );
# P::FM by default, only waits for its own child processes,
# which is what we want.
# Refer to 'BLOCKING CALLS' in the module documentation.
# Let's decrease the sleep period time (default 1.0).
$pm->set_waitpid_blocking_sleep(0.25);
$pm->run_on_finish(sub {
my ( $pid, $exit_code, $ident, $exit_signal, $core_dump, $data ) =
+@_;
if ( $exit_code || $exit_signal || $core_dump ) {
# Handle error.
}
$status += $data->{ status };
});
for my $list ( @testLists ) {
$pm->start and next;
my $status = regressions( $opts, $list );
$pm->finish( 0, { status => $status } );
}
$pm->wait_all_children();
print "status: $status\n";
printf "duration: %0.3f seconds\n", time() - $start;
__END__
27470: sun
27471: moon
27472: wind
27473: air
status: 4
duration: 2.257 seconds