我正在做一堆我希望并行运行的系统调用:
system(" sleep 5 && echo step 1 done &");
system(" sleep 3 && echo step 2 done &");
system(" sleep 7 && echo step 3 done &");
// block here
Run Code Online (Sandbox Code Playgroud)
在完成所有系统调用之前,如何阻止程序流程?
最简单的方法是fork为每个系统调用创建一个新的子进程,然后等待它们完成.这是一个简化的例子:
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";
Run Code Online (Sandbox Code Playgroud)