Здесь есть несколько вопросов, которые нужно прояснить.
Базовый пример
use warnings;
use strict;
use feature 'say';
my @coderefs;
for my $i (1..4) {
push @coderefs, sub {
my @args = @_;
say "Sub #$i with args: @args";
};
}
my @procs;
for my $i (0..$#coderefs) {
my $pid = fork // do {
warn "Can't fork: $!";
# retry, or record which subs failed so to run later
next;
};
if ($pid==0) {
$coderefs[$i]->("In $$: $i");
exit;
}
push @procs, $pid;
#sleep 1;
}
say "Started: @procs";
for (@procs) {
my $goner = wait;
say "$goner exited with $?";
}
Мы генерируем анонимные подпрограммы и сохраняем эти ссылки кода в массиве, затем проходим через этот массив и запускаем столько процессов, в каждом из которых выполняется подпрограмма. После этого родитель wait
s на всех этих, но обычно вы будете использовать waitpid
; см. документы, перечисленные ниже.
Дочерний процесс всегда exit
с, иначе у вас будет несколько процессов, выполняющих весь остальной код в программе. Как только дочерний процесс завершает работу, ядро уведомляет родительский процесс, и родитель может «забрать» это уведомление («пожинать» статус завершения дочернего процесса) через wait
/ waitpid
или использовать обработчик сигнала, чтобы игнорировать это.
Если родитель никогда не делает этого после выхода дочернего элемента и выходит из него позже, то ОС остается застрявшей с этой информацией о (вышедшем) дочернем процессе в таблице процессов; это зомби. Так что вам нужно wait
, чтобы ОС работала с дочерним процессом (и вы проверите, как он прошел). Или используйте обработчик сигнала, чтобы указать, что вы не заботитесь о выходе ребенка. Современные системы пожинают потенциальных зомби, но не всегда, и вы не можете на это полагаться; убери за собой.
Обратите внимание, вам нужно будет прочитать perlipc , fork , wait и waitpid , perlvar ... и многие другие страницы, с которыми вы столкнетесь, работая над всем этим. Это займет немного игры и проб и ошибок. После того, как вы разберетесь со всем этим, вы можете начать использовать модули, по крайней мере, для некоторых типов задач.