В Perl, как я могу заблокироваться для набора системных вызовов конца?

Я делаю набор системных вызовов, которые я хочу выполнить параллельно:

system(" sleep 5 && echo step 1 done &");
system(" sleep 3 && echo step 2 done &");
system(" sleep 7 && echo step 3 done &");

// block here

Как я могу заблокировать процесс выполнения программы, пока все системные вызовы не закончены?

10
задан Ross Rogers 9 February 2010 в 19:23
поделиться

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";
9
ответ дан 3 December 2019 в 23:12
поделиться

Я всегда ненавидел комментарии, которые заполняют половину экрана звездочками только для того, чтобы сказать вам, что функция возвращает строку, я никогда не читал эти комментарии.

Некоторые комментарии в этом ключе, обычно не с форматированием , которые крайние, на самом деле существуют, чтобы помочь инструментам, таким как 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 .

(Точный код для этого оставлен в качестве упражнения для читателя - каждый должен написать это с нуля хотя бы один раз, чтобы понять детали. На этом сайте также существует множество примеров.)

4
ответ дан 3 December 2019 в 23:12
поделиться

как насчет запуска каждого системного вызова из другого потока и присоединения к потокам

1
ответ дан 3 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: