Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re: Learning to use fork()

by markong (Pilgrim)
on Jan 14, 2019 at 23:38 UTC ( [id://1228561]=note: print w/replies, xml ) Need Help??


in reply to Learning to use fork()

Have a look at Parallel::ForkManager.

Replies are listed 'Best First'.
Re^2: Learning to use fork()
by ovedpo15 (Pilgrim) on Jan 15, 2019 at 00:41 UTC
    Thanks for the reply. I prefer to use the fork method. My main question is what to do if the fork was not success? I still want the reports to be created even if not parallel. Let start with 5 functions:
    sub1(); sub2(); sub3(); sub4(); sub5();
    I would like to loop through the functions (is it even possible?) and create a fork for each one. What should I do if the fork failed?

      Here is an example way to do what you want for educational purposes (Parallel::ForkManager is really the way to go in production code).

      It is possible to loop through functions by taking references with the \& syntax:
      sub sub1 { print 'sub1 ran' } sub sub2 { print 'sub2 ran' } my @refs = (\&sub1, \&sub2); $_->() foreach @refs;
      Fork failure is indicated by an undef return value by the fork function. If you want to go on with processing in a non-parallel manner when fork fails, you can just check if it's defined. Full example:
      use strict; use warnings; use POSIX ':sys_wait_h'; my @subs_to_run = ( \&sub1, \&sub2, \&sub3, \&sub4, \&sub5, ); foreach my $sub (@subs_to_run) { my $is_parent = fork; # try to fork next if $is_parent; # both child and fork failure will be false $sub->(); # we're in the child or fork failed, run the sub exit if defined $is_parent; # exit only if actually forked } 1 while waitpid(-1, WNOHANG) > 0; # wait for all children
        It's more clear to me now, buy it will work only if the subs does not get any arguments, right? What if they does?
        If the module you suggested can help us on solving this problem, I would love to see an example

      Recover or die:

      if ($pid = fork) { # parent } else { die "cannot fork: $!" unless defined $pid; # child }

      I prefer to use the fork method.

      you mean thats what your homework said you should do

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (2)
As of 2024-04-24 23:36 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found