Perl Parallel::ForkManager wait_all_children() занимает чрезмерно много времени

StackOverflow https://stackoverflow.com/questions/2428690

Вопрос

У меня есть скрипт, который использует 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 для получения дополнительной информации.Если задержка исчезает, значит, симптом, который вы наблюдаете, был вызван тем фактом, что вы утверждали, что разветвленный процесс завершился до того, как это было сделано.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top