http://www.perlmonks.org?node_id=1073502


in reply to Re^3: Please Explain the Parallel::ForkManager Idiom my $pid = $pm->start and next;
in thread Please Explain the Parallel::ForkManager Idiom my $pid = $pm->start and next;

Why?

Exactly! That's the code in the demo script in the Parallel::ForkManager documentation. It's the example I was running and studying earlier. The PIDs and exit codes are included in the code for didactic reasons.

You'll appreciate my similar demo script based on the same kids-in-line-at-the-pool theme.

use strict; use warnings; use Parallel::ForkManager; $| = 1; my $MAXIMUM_KIDS_IN_POOL = 3; my $MAXIMUM_TIME_IN_POOL = 30; # Seconds my $lifeguard = Parallel::ForkManager->new($MAXIMUM_KIDS_IN_POOL); my @kids = qw( Ann Bob Cal Dan Eve Fay Gus Hal Ike Joe Kim Lee Meg ); $lifeguard->run_on_start( sub { my ($pid, $kid) = @_; print "\nThe lifeguard waves $kid into the pool\n"; } ); $lifeguard->run_on_finish( sub { my ($pid, $exit_code, $kid) = @_; print "\n$kid climbs out of the pool\n"; } ); $lifeguard->run_on_wait( sub { print "."; }, 0.3 ); my $number_of_kids = @kids; print "\nThere are $number_of_kids kids in line at the pool\n\n@kids\n +"; KID_IN_LINE: for my $kid (@kids) { my $pid = $lifeguard->start($kid); next KID_IN_LINE if $pid != 0; srand(); my $time = int(rand($MAXIMUM_TIME_IN_POOL)) + 1; print "\n$kid jumps into the pool\n"; sleep $time; print "\nThe lifeguard orders $kid out of the pool after $time sec +onds\n"; sleep 0.5; $lifeguard->finish(); } print "\nAll the kids have been in the pool\n"; $lifeguard->wait_all_children(); print "\nAll the kids are out of the pool\n"; exit 0;

(As I post this script here, I notice there are vestiges of the original script still in the callback subs; namely, $pid and $exit_code. I could remove them.)

Jim

UPDATE:  And if I'm truly serious about not caring about the PIDs, I could do this instead:

next KID_IN_LINE if $lifeguard->start($kid) != 0;

ANOTHER UPDATE:  More weirdness. This works fine…

$lifeguard->run_on_start( sub { my $kid = pop; print "\nThe lifeguard waves $kid into the pool\n"; } );

…but this blows up with Use of uninitialized value $kid in concatenation (.) or string at Pool.pl line 27

$lifeguard->run_on_finish( sub { my $kid = pop; print "\n$kid climbs out of the pool\n"; } );

No variation of pop()-ing @_ in run_on_finish() works.

YET ANOTHER UPDATE:  OK, this is documented in…ahem…the documentation.