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 call开发者_如何学JAVAs are finished?
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";
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.)
what about running each one of the system call from a different thread and join on the threads
精彩评论