Perl Parallel :: ForkManager wait_all_children () занимает слишком много времени - PullRequest
2 голосов
/ 12 марта 2010

У меня есть скрипт, который использует 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? Thx!

1 Ответ

8 голосов
/ 12 марта 2010

Я пробовал это:

#!/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 с Parallel :: 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;

См. Обратные вызовы в документации Parallel :: ForkManager для получения дополнительной информации. Если задержка исчезает, то наблюдаемый вами симптом связан с тем, что вы утверждаете, что раздвоенный процесс завершился до того, как он был завершен.

...