Perl Parallel::ForkManager wait_all_children() занимает чрезмерно много времени
-
19-09-2019 - |
Вопрос
У меня есть скрипт, который использует Parallel::ForkManager
.Однако процесс wait_all_children() занимает невероятно много времени даже после завершения всех дочерних процессов.Способ, который я знаю, - это распечатать некоторые временные метки (см. Ниже).У кого-нибудь есть какие-либо идеи, что может быть причиной этого (у меня на моем компьютере 16 ядер процессора)?
my $pm = Parallel::ForkManager->new(16);
for my $i (1..16) {
$pm->start($i) and next;
... do something within the child-process ...
print (scalar localtime), " Process $i completed.\n";
$pm->finish();
}
print (scalar localtime), " Waiting for some child process to finish.\n";
$pm->wait_all_children();
print (scalar localtime), " All processes finished.\n";
Очевидно, что я получу Waiting for some child process to finish
сначала сообщение с отметкой времени, скажем, 7:08:35
.Тогда я получу список Process i completed
сообщения, причем последнее из них в 7:10:30
.Однако я не получаю это сообщение All Processes finished
до тех пор , пока 7:16:33
(!).Почему эта 6-минутная задержка между 7:10:30 и 7:16:33?Спасибо!
Решение
Я попробовал это:
#!/opt/perl/bin/perl
use strict; use warnings;
use Parallel::ForkManager;
my $pm = Parallel::ForkManager->new(16);
for my $i (1..16) {
$pm->start($i) and next;
sleep rand 20;
printf "%s : Process %d completed\n", scalar localtime, $i;
$pm->finish;
}
printf "%s: Waiting for some child to finish\n", scalar localtime;
$pm->wait_all_children;
printf "%s: All processes finished.\n", scalar localtime;
Я получил:
[sinan@archardy Src]$ ./y.pl Thu Mar 11 17:14:16 2010 : Process 3 completed Thu Mar 11 17:14:16 2010: Waiting for some child to finish Thu Mar 11 17:14:18 2010 : Process 8 completed Thu Mar 11 17:14:18 2010 : Process 14 completed <snip>...</snip> Thu Mar 11 17:14:34 2010 : Process 12 completed Thu Mar 11 17:14:34 2010: All processes finished.
У меня есть perl 5.10.1
в Linux с Параллельный::ForkManager версия 0.7.5
.
Следовательно, я прихожу к выводу, что любая проблема, с которой вы столкнулись, возникает как следствие того, что происходит, когда вы
# ... do something within the child-process ...
Обновить: Проблема в том, что вы печатаете Process finished message
перед тем, как finish
звони.Попробуйте следующую версию:
#!/opt/perl/bin/perl
use strict; use warnings;
use Parallel::ForkManager;
my $pm = Parallel::ForkManager->new(16);
$pm->run_on_finish( sub {
printf "%s : Process completed: @_\n", scalar localtime
});
for my $i (1..16) {
$pm->start($i) and next;
sleep rand 20;
$pm->finish;
}
printf "%s: Waiting for some child to finish\n", scalar localtime;
$pm->wait_all_children;
printf "%s: All processes finished.\n", scalar localtime;
Видишь Обратные вызовы параллельно::документация ForkManager для получения дополнительной информации.Если задержка исчезает, значит, симптом, который вы наблюдаете, был вызван тем фактом, что вы утверждали, что разветвленный процесс завершился до того, как это было сделано.