Я делаю набор системных вызовов, которые я хочу выполнить параллельно:
system(" sleep 5 && echo step 1 done &");
system(" sleep 3 && echo step 2 done &");
system(" sleep 7 && echo step 3 done &");
// block here
Как я могу заблокировать процесс выполнения программы, пока все системные вызовы не закончены?
Самый простой способ сделать это, вероятно, - это 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";
Я всегда ненавидел комментарии, которые заполняют половину экрана звездочками только для того, чтобы сказать вам, что функция возвращает строку, я никогда не читал эти комментарии.
Некоторые комментарии в этом ключе, обычно не с форматированием , которые крайние, на самом деле существуют, чтобы помочь инструментам, таким как JavaDoc и Doxygen, создать документацию для вашего кода. Это, я думаю, хорошая форма комментария, потому что она имеет и гуманистический, и машиночитаемый формат для документации (чтобы машина могла перевести его в другие, более полезные форматы, такие как HTML), помещает документацию близко к коду, который она документирует (чтобы в случае изменения кода документация с большей вероятностью обновлялась для отражения этих изменений)и, как правило, дает хорошее (и немедленное) объяснение кому-то новому для большой кодовой базы, почему существует конкретная функция.
В противном случае я согласен со всем остальным, что было заявлено. Комментировать почему, и только когда это не очевидно. Кроме Doxygen комментариев, мой код, как правило, имеет очень мало комментариев.
-121--2894340-* вызовет globbing и расширится до всех файлов в каталоге, в котором вы находитесь. Просто процитируйте * и запустите программу, как
./ваша программа '10 * 10'
или
./ваша программа 10 '*' 10
В первом случае ваша программа будет передана только 1 аргумент, argv [1] будет строкой "10 * 10", во втором случае вы получите переданные 3 аргументы
-121--4551154-Создайте дочерний процесс для выполнения каждого задания, а в родительском - дождитесь завершения этих процессов перед выходом.
См. perldoc perlfork , perldoc -f vilk и perldoc -f waitpid .
(Точный код для этого оставлен в качестве упражнения для читателя - каждый должен написать это с нуля хотя бы один раз, чтобы понять детали. На этом сайте также существует множество примеров.)
как насчет запуска каждого системного вызова из другого потока и присоединения к потокам