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?
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With