Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Perl, how can I block for a bunch of system calls to finish?

Tags:

perl

I'm doing a bunch of system calls that I want to run in parallel:

system(" sleep 5 && echo step 1 done &");
system(" sleep 3 && echo step 2 done &");
system(" sleep 7 && echo step 3 done &");

// block here

How can I block the program flow until all the system calls are finished?

like image 392
Ross Rogers Avatar asked Feb 09 '10 19:02

Ross Rogers


3 Answers

The easiest way to do this is probably to fork a new child process for each system call, and then wait for them to finish. Here's a simplified example:

my @commands = ( "sleep 5 && echo step 1 done",
                 "sleep 3 && echo step 2 done",
                 "sleep 7 && echo step 3 done" );

my @pids;
foreach my $cmd( @commands ) {
    my $pid = fork;
    if ( $pid ) {
        # parent process
        push @pids, $pid;
        next;
    }

    # now we're in the child
    system( $cmd );
    exit;            # terminate the child
}

wait for @pids;   # wait for each child to terminate

print "all done.\n";
like image 178
friedo Avatar answered Sep 21 '22 15:09

friedo


Fork a child process to perform each job, and in the parent, wait for those processes to finish before exiting.

See perldoc perlfork, perldoc -f fork and perldoc -f waitpid.

(The exact code for this is left as an exercise for the reader -- everyone should have to write this from scratch at least once, to understand the details involved. There are lots of examples on this site as well.)

like image 36
Ether Avatar answered Sep 18 '22 15:09

Ether


what about running each one of the system call from a different thread and join on the threads

like image 37
jojo Avatar answered Sep 21 '22 15:09

jojo