Hi, here is a demonstration using MCE by marioroy. We are using MCE::Shared to implement shared data between child processes. We are also using MCE::Flow to manage the child processes, but you could use native fork() or any other technique.
use strict; use warnings; use feature 'say';
use MCE::Shared;
use MCE::Flow;
tie my $foo, 'MCE::Shared', 0;
tie my @bar, 'MCE::Shared';
tie my %baz, 'MCE::Shared';
my $mutex = MCE::Mutex->new;
mce_flow { max_workers => 4 }, sub {
my ( $mce ) = @_;
my ( $pid, $wid ) = ( MCE->pid, MCE->wid );
# Locking is necessary when multiple workers update the same eleme
+nt
$mutex->enter( sub { $foo += 1 } );
# Otherwise, locking is optional for unique elements.
$bar[ $wid - 1 ] = $pid;
$baz{ $pid } = $wid;
return;
};
say "scalar :";
say " count is now $foo";
say "array :";
say " pid $_ was here" for @bar;
say "hash :";
say " worker $baz{ $_ } had pid $_" for sort keys %baz;
__END__
Output:
scalar :
count is now 4
array :
pid 13826 was here
pid 13827 was here
pid 13828 was here
pid 13829 was here
hash :
worker 1 had pid 13826
worker 2 had pid 13827
worker 3 had pid 13828
worker 4 had pid 13829
See also: MCE Cookbook, MCE Examples.
Hope this helps!
The way forward always starts with a minimal test.
|