arthurs has asked for the wisdom of the Perl Monks concerning the following question:

Would like some explanation about how Parallel:ForkManager module works. Suppose I have the following: my $manager = new Parallel::ForkManager( 20 ); foreach my $command (@commands) { $manager->start and next; system( $command ); $manager->finish; }; From what I understand, the "$manager->start" does the fork and "and next" goes to another $command in @command array (correct me if I am wrong there). Does it mean that I would have 20 child processes where each child would run "system($command)" for each $command in the array, right? And the parent is not going to run any of those "system($command)", right? What would the parent process do then? There is a problem I am having with ForkManager, but I first need to clarify that I understand how ForkManager works. Thank you.

Replies are listed 'Best First'.
Re: help with Parallel:ForkManager
by ikegami (Patriarch) on Jan 11, 2010 at 22:46 UTC

    It will block in start until a child ends.

    By the way,

    for my $command (@commands) { $manager->start and next; ... system( $command ); $manager->finish; }
    is better written as
    for my $command (@commands) { $manager->start and next; ... exec( $command ); $manager->finish; }

    since all finish does is end the process.

      Thanks ikegami, but I am still not clear. If instead of using ForkManager module, I call fork once, it would make 2 processes running (a parent and a child) and I would need to check pid to know if I am in the parent or in a child. Now, if I use ForkManager and set # of processes to 20, and do 'start and next' the FIRST time in the loop, do I have 2 processes at this moment -- a parent and a child? If yes, then since I am not checking which process I am in, how does it know that a parent need to process $command[0] and the child need to take care of the next $command1 (or vise versa)? Thanks much.

        then since I am not checking which process I am in

        But you are. start and next; is the same as next if start;