В Perl, как я могу заблокировать несколько системных вызовов для завершения?
Я делаю кучу системных вызовов, которые я хочу выполнять параллельно:
system(" sleep 5 && echo step 1 done &");
system(" sleep 3 && echo step 2 done &");
system(" sleep 7 && echo step 3 done &");
// block here
Как я могу заблокировать выполнение программы до завершения всех системных вызовов?
3 ответа
Самый простой способ сделать это, вероятно, 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";
Разветвите дочерний процесс для выполнения каждой работы, и в родительском процессе дождитесь завершения этих процессов, прежде чем завершить работу.
Смотрите perldoc perlfork, perldoc -f fork и perldoc -f waitpid.
(Точный код для этого оставлен в качестве упражнения для читателя - каждый должен написать это с нуля хотя бы один раз, чтобы понять детали. Также на этом сайте есть много примеров.)
Как насчет запуска каждого из системных вызовов из другого потока и присоединения к потокам