потерять детей в развилке - PullRequest
3 голосов
/ 31 июля 2011
use strict;
use warnings;
use Parallel::ForkManager;

my $log = "/scripts/downloads/test.log";
  print "Check the $log file\n" and open(LOG,">$log");
   *STDERR = *LOG;
  *STDOUT = *LOG;

my $pmm=new Parallel::ForkManager(9);

my @arr=(1..200);
for(@arr){

$pmm->start and next; # do the fork
print $_."\n";
$pmm->finish; # do the exit in the child process
}

$pmm->wait_all_children;

open(READ,"$log") or die $!;
my @check=<READ>;

print "there are ".scalar @arr ." items....";
print "but we only got ".scalar @check." items\n";

Это упрощенная версия сценария, который у меня есть. В этом случае каждый раз, когда я использую более 9 детей, я теряю где-то от 3-15 детей, иногда больше. Очевидный ответ - использовать меньше детей, но в моем «реальном» сценарии, если я использую меньше детей, выполнение сценария займет гораздо больше часов ... времени, которого у нас нет. Почему это теряет детей и есть ли способ «поймать» их и повторно запустить их, если они не бегут?

ТНХ!

1 Ответ

4 голосов
/ 31 июля 2011

Все ваши дети пишут в один и тот же файл журнала, и вы не предприняли никаких шагов, чтобы они не перезаписывали вывод друг друга. Не имея возможности воспроизвести проблему на моем компьютере, я не могу сказать наверняка, но я бы предположил, что все N дочерних элементов на самом деле работают, но некоторые результаты выходят из строя.

Чтобы N процессов одновременно записывали в один и тот же файл без потери вывода, необходимо открыть файл для append вместо обычной записи. В C вы должны использовать флаги O_WRONLY|O_APPEND с open(2) или режим "a" с fopen(3). Затем ядро ​​гарантирует, что все записи идут в самый конец файла. (Согласно справочной странице, это не надежно по сравнению с NFS.) Вы также должны обратить внимание на , сколько вы записываете в файл за раз, иначе выходные данные одного процесса могут появиться в середина выхода из другого. Я не знаю, возможно ли что-либо из этого в Perl, но похоже, что вы все равно нашли другое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...