use strict; use warnings; use feature 'say'; use Data::Dumper; ++$Data::Dumper::Sortkeys; use Time::HiRes qw/ usleep time /; use MCE::Shared; use MCE::Loop; my $pid = $$; say "PID $pid"; tie my %hash, 'MCE::Shared', (); $SIG{'INT'} = sub { kill 'TERM', -$$ }; $SIG{'TERM'} = sub { exit 0 }; MCE::Loop->init( max_workers => 6, chunk_size => 10 ); mce_loop { say "Forked child with $$"; my ( $mce, $chunk_ref, $chunk_id ) = @_; for ( @{ $chunk_ref } ) { $hash{ sprintf '%.2d %s', $_, $$ } = time; sleep 1; } } ( 0 .. 99 ); MCE::Loop->finish; END { say sprintf '%s %s (%s) in END', $$, time, $$ == $pid ? 'Parent' : 'Child'; if ( $$ == $pid ) { say 'Parent is ready to dump'; say 'Dumping: ' . Dumper \%hash; } } __END__
Here's an example of the output I am getting from my test program:
##
use strict; use warnings; use feature 'say';
use Data::Dumper; ++$Data::Dumper::Sortkeys;
use Parallel::ForkManager;
my $pid = $$;
say "PID $pid";
$SIG{'INT'} = sub { kill 'TERM', -$$ };
$SIG{'TERM'} = sub { exit 0 };
my $pm = Parallel::ForkManager->new(6);
for ( 0 .. 9 ) {
my $start = 10 * $_;
$pm->start and next;
for ( $start .. $start + 9 ) {
say sprintf '%.2d %s', $_, $$;
sleep 1;
}
$pm->finish;
}
END {
say sprintf '%s (%s) in END', $$, $$ == $pid ? 'Parent' : 'Child';
}
__END__
##
##
PID 14274
00 14275
10 14276
20 14277
30 14278
40 14279
50 14280
01 14275
11 14276
21 14277
31 14278
41 14279
51 14280
02 14275
12 14276
22 14277
32 14278
42 14279
52 14280
^C43 14279
33 14278
23 14277
13 14276
03 14275
53 14280
14279 (Child) in END
14280 (Child) in END
14277 (Child) in END
14275 (Child) in END
14276 (Child) in END
14274 (Parent) in END
14278 (Child) in END