Я использую обычный модуль Parallel :: ForkManager в Perl. Я выполняю около 10 дочерних процессов. Функция pass_thresholds занимает несколько миллисекунд или наносекунд (проверено). В случае, если я запускаю все процессы один за другим (без Parallel :: ForkManager), весь процесс занимает 80-250 миллисекунд. Если я запускаю их параллельно, весь процесс занимает не менее 1 секунды. Я обнаружил, что вилка тратит 1 секунду, чтобы запустить функцию финиша. Я поставил таймер, когда дочерний процесс закончил свою работу и должен перейти к функции «Finish». Одна секунда - это слишком много для моего развития.
sub parallel_execute {
my $this = shift;
foreach my $a (@a_array) {
my $pid = $this->{fork_manager}->start and next;
my $res = $a->passes_thresholds();
$a->{timer} = Benchmark::Timer->new();
$svc->{timer}->start;
$this->{fork_manager}->finish(0,{a => $a, plugin_result => $res});
}
}
$this->{fork_manager}->run_on_finish( sub {
my ($pid, $exit_code, $ident, $exit_signal, $core_dump, $data_structure_reference) = @_;
my $a = $data_structure_reference->{a};
if (exists $a->{timer}) {
$a->{timer}->stop;
debug "took: " . $a->{timer}->report;
}
});
У вас есть идея, почему для запуска команды финиша потребовалась не менее 1 секунды?
(я использую сервер Unix и Perl 5.10)