我正在进行一系列我希望并行运行的系统调用:
system(" sleep 5 && echo step 1 done &");
system(" sleep 3 && echo step 2 done &");
system(" sleep 7 && echo step 3 done &");
// block here
如何在所有系统调用完成之前阻止程序流程?
答案 0 :(得分:9)
执行此操作的最简单方法可能是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";
答案 1 :(得分:4)
分叉子进程以执行每个作业,并在父进程中等待这些进程在退出之前完成。
请参阅perldoc perlfork,perldoc -f fork和perldoc -f waitpid。
(确切的代码留给读者练习 - 每个人都应该至少从头开始写一次,以了解所涉及的细节。此网站上也有很多例子。)< / p>
答案 2 :(得分:1)
如何从不同的线程运行每个系统调用并加入线程