use strict; use warnings; use feature 'say';
use Data::Dumper; ++$Data::Dumper::Sortkeys;
use MCE::Shared;
use MCE::Loop;
$|++;
my $pid = $$; say "PID $pid";
tie my %hash, 'MCE::Shared', ();
MCE::Loop->init( max_workers => 2, chunk_size => 1 );
mce_loop {
my ( $mce, $chunk_ref, $chunk_id ) = @_;
say sprintf 'Forked worker in slot %s with pid %s for chunk %s', MCE->wid, MCE->pid, $chunk_id;
for ( @{ $chunk_ref } ) {
$hash{ sprintf '%.2d %s', $_, $$ } = time;
say "After $_: " . Dumper \%hash;
sleep 1;
}
} ( 0 .. 4 );
MCE::Loop->finish;
$SIG{'INT'} = sub {
say 'Hello from INT';
if ( tied(%hash)->len ) {
(MCE->wid == 0) ? say 'Parent is ready to dump'
: say 'Worker is ready to dump';
say 'Dumping: ' . Dumper \%hash;
%hash = ();
}
MCE::Signal::stop_and_exit('INT');
};
$SIG{'TERM'} = sub {
say 'Hello from TERM';
if (MCE->wid > 0) { # worker
MCE->exit(0);
} else { # parent
say 'Parent is ready to dump';
say 'Dumping: ' . Dumper \%hash;
MCE::Signal::stop_and_exit('TERM');
}
};
END {
say sprintf '%s %s (%s) in END', $$, time, $$ == $pid ? 'Parent' : 'Child';
if ( MCE->wid == 0 or $$ == $pid ) {
say "Parent is ready to dump";
say 'Dumping: ' . Dumper \%hash;
}
}
__END__
####
PID 21106
Forked worker in slot 2 with pid 21110 for chunk 1
Forked worker in slot 1 with pid 21109 for chunk 2
After 0: $VAR1 = {
'00 21110' => '1491574316',
'01 21109' => '1491574316'
};
After 1: $VAR1 = {
'00 21110' => '1491574316',
'01 21109' => '1491574316'
};
^C
## mce3.pl: caught signal (INT), exiting
Killed
##
##
PID 20939
Forked worker in slot 2 with pid 20942 for chunk 1
Forked worker in slot 1 with pid 20941 for chunk 2
After 0: $VAR1 = {
'00 20942' => '1491574178',
'01 20941' => '1491574178'
};
After 1: $VAR1 = {
'00 20942' => '1491574178',
'01 20941' => '1491574178'
};
Forked worker in slot 2 with pid 20942 for chunk 3
Forked worker in slot 1 with pid 20941 for chunk 4
After 2: $VAR1 = {
'00 20942' => '1491574178',
'01 20941' => '1491574178',
'02 20942' => '1491574179',
'03 20941' => '1491574179'
};
After 3: $VAR1 = {
'00 20942' => '1491574178',
'01 20941' => '1491574178',
'02 20942' => '1491574179',
'03 20941' => '1491574179'
};
Forked worker in slot 2 with pid 20942 for chunk 5
After 4: $VAR1 = {
'00 20942' => '1491574178',
'01 20941' => '1491574178',
'02 20942' => '1491574179',
'03 20941' => '1491574179',
'04 20942' => '1491574180'
};
20941 1491574181 (Child) in END
20942 1491574181 (Child) in END
20939 1491574181 (Parent) in END
Parent is ready to dump
Dumping: $VAR1 = {
'00 20942' => '1491574178',
'01 20941' => '1491574178',
'02 20942' => '1491574179',
'03 20941' => '1491574179',
'04 20942' => '1491574180'
};