Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re^4: Please Explain the Parallel::ForkManager Idiom my $pid = $pm->start and next;

by Jim (Curate)
on Feb 05, 2014 at 01:46 UTC ( #1073502=note: print w/ replies, xml ) Need Help??


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.


Comment on Re^4: Please Explain the Parallel::ForkManager Idiom my $pid = $pm->start and next;
Select or Download Code
Re^5: Please Explain the Parallel::ForkManager Idiom my $pid = $pm->start and next;
by runrig (Abbot) on Feb 05, 2014 at 19:18 UTC
    OK, this is documented in…ahem…the documentation.

    Yes, it helps to read the documentation, where you learn what the order of arguments in @_ are.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1073502]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (11)
As of 2015-07-06 11:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (72 votes), past polls