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