in reply to Re: help with Parallel:ForkManager
in thread help with Parallel:ForkManager

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.

Replies are listed 'Best First'.
Re^3: help with Parallel:ForkManager
by ikegami (Patriarch) on Jan 12, 2010 at 16:13 UTC

    then since I am not checking which process I am in

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

      You are a man of few words! Let me see if I understand this correctly. When I do '$pm->start and next', it forks a child which takes the first argument of the @command array and starts executing. At the same time, without waiting for the 1st child to finish, it forks another child that processes the 2nd argument of the array and so on, until 20 children are running in parallel. If 20 children already running, but there are still unprocessed elements in the array, it would wait until a child would finish and fork another child. The array is processed by children only, the parent doesn't go through the array. Is that about right? Thanks much.

        You are a man of few words!

        You said it was different than fork(), which meant you knew how fork() worked. I pointed out that it isn't different than fork().

        Is that about right?

        Up until the last sentence, only minor errors or clarifications need to be made:

        When I do '$pm->start and next', it forks a child which takes the first argument of the @command arraygets a copy of the current process's memory space including $command and starts executing. At the same time, without waiting for the 1st child to finish, itthe parent forks another child that processes the 2nd argument of the array and so on, until 20 children are running in parallel. If 20 children already running, but there are still unprocessed elements in the array, it would wait until a child would finish and forkbefore forking another child.

        But then you followed with:

        The array is processed by children only, the parent doesn't go through the array.

        It might depend on what you mean by "processed" and "go through", but that sounds completely backwards.

        You just described how the parent forks a child for each array element and how each child processes only one element of the array.

        Code executed in parent:

        for my $command (@commands) { $manager->start and next; }

        Code executed in child:

        0 and next; exec( $command ); $manager->finish;

        Note the lack of array in the code executed by the child?