Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

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

by Jim (Curate)
on Feb 04, 2014 at 19:50 UTC ( [id://1073458]=note: print w/replies, xml ) Need Help??


in reply to Re^5: 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;

"Yet another" mental block? Yes, indeed. ☹

As evidence of my earnestness and seriousness, here's a demo Perl script my friend wrote and shared with me last weekend. I refactored it into subroutines as an exercise to help me understand how forking works, which I sort of thought I did until I started toying with Parallel::ForkManager afterwards. Please rip the script to shreds if you think it will help me learn.

#!perl use strict; use warnings; local $| = 1; # Autoflush output... my $MAXIMUM_NAP_TIME = 30; # In seconds my $POLLING_INTERVAL = 3; # In seconds my $MAXIMUM_JOBS = 5; my @jobs; # Array of two-dimensional job arrays [ Job Code, Process ID + ] #--------------------------------------------------------------------- +-- # Enqueue initial jobs... for (1 .. $MAXIMUM_JOBS) { push @jobs, enqueue_job(); } # Run jobs indefinitely... while (1) { my $job = shift @jobs; push @jobs, probe_job($job); sleep $POLLING_INTERVAL; } exit 0; #--------------------------------------------------------------------- +-- sub enqueue_job { my $code = make_code(); my $pid = take_nap(); my $job = [ $code, $pid ]; show_step('Enqueuing', $code, $pid); return $job; } sub probe_job { my $job = shift; my $code = $job->[0]; my $pid = $job->[1]; show_step('Probing', $code, $pid); return kill(0, $pid) ? $job : dequeue_job($job); } sub dequeue_job { my $job = shift; my $code = $job->[0]; my $pid = $job->[1]; show_step('Dequeuing', $code, $pid); return enqueue_job(); } sub take_nap { my $nap_duration = int rand $MAXIMUM_NAP_TIME; return system 1, "sleep $nap_duration"; } BEGIN { my $job_number = 0; sub make_code { return sprintf "%02d:%02d:%02d.%06d", (localtime)[2, 1, 0], ++$job_number; } } sub show_step { my $step = shift; my $code = shift; my $pid = shift; printf "%-9s Job Code %s, PID %d\n", $step, $code, $pid; } __END__

Thank you for the references to the helpful resources.

Jim

  • Comment on Re^6: Please Explain the Parallel::ForkManager Idiom my $pid = $pm->start and next;
  • Download Code

Replies are listed 'Best First'.
Re^7: Please Explain the Parallel::ForkManager Idiom my $pid = $pm->start and next;
by BrowserUk (Patriarch) on Feb 04, 2014 at 19:58 UTC
    Please rip the script to shreds

    This subroutine is pointless.

    You are invoking an external program via system in order to sleep, but you are adding a first argument of 1 to that call to system, which means the external program is run asynchronously and the subroutine returns immediately:

    sub take_nap { my $nap_duration = int rand $MAXIMUM_NAP_TIME; return system 1, "sleep $nap_duration"; }

    Why, when you want to create a delay, are you calling it asynchronously?

    But, more to the point, why are you calling an external program in order to sleep, when perl has a built-in sleep?

    (You are aware that using fork on Windows means you're actually not forking a process but spawning a thread don't you?)


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others about the Monastery: (4)
As of 2024-04-24 12:21 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found