Perl Parallel :: Forkmanager не позволяет собирать значения переменных - PullRequest
2 голосов
/ 22 июня 2010

Может быть, из-за того, что дочерние процессы не знают о моем хэше (см. Приведенный ниже код), вывод хеша% ничего не собирает ... Есть ли другой способ собрать значение кроме записи файла tmp?

foreach $Item (@AllItems) {
$pid = $pm->start($Item) and next;
$Temp = qx($Item);
$output{$Item}= $Temp; // This doesn't collect anything. :-(
$pm->finish;
}

$pm->wait_all_children;

ТИА, Тим

Ответы [ 2 ]

7 голосов
/ 22 июня 2010

Разветвленные процессы имеют свои собственные копии (ну, например, копии при записи) памяти родительского процесса. Запись в хэш дочернего процесса не повлияет на хэш родительского процесса.

Чтобы делать то, что вы хотите, вам нужно использовать какой-то IPC. См. Справочную страницу perlipc для подробного обсуждения различных возможностей.

Для чего-то подобного я бы, вероятно, использовал что-то простое, например, хэш на диске. DB_File предоставляет приятный интерфейс с привязанным хешем. Вот как вы можете это сделать:

use strict;
use warnings;

use DB_File;

tie my %output, "DB_File", "output.dat" ;

foreach my $item( @AllItems) { 
    my $pid = $pm->start and next;
    $output{$item} = qx($item);
    $pm->finish;
}
2 голосов
/ 22 июня 2010

Каждый процесс имеет свою собственную память, и данные не распределяются между процессами.Но у вас есть несколько вариантов:

  1. Запись данных из дочерних процессов во временные файлы для чтения в родительском файле, как вы предлагаете
  2. Использование сокетов или каналов для выполнения того же самого
  3. Используйте threads с общими переменными вместо fork ()
  4. Используйте средство общей памяти (см. этот вопрос , дляпример)
  5. Использовать облегченную базу данных (SQLLite, возможно DBD::CSV).Это причудливый способ использования временных файлов.

Еще есть?Я понятия не имею, как использовать встроенные функции shmget / shmread / shmwrite или они могут быть полезны здесь.Другие комментаторы, пожалуйста, не стесняйтесь редактировать.

...