Perl Fork Threads Захват Вывод - PullRequest
       8

Perl Fork Threads Захват Вывод

2 голосов
/ 08 февраля 2012

Я хочу создать 5 процессов, которые все создадут 100 потоков каждый для небольшой функции. Проблема в том, что эта функция генерирует много значений, которые я хочу записать в хеш. Я могу сделать с одним процессом и создать 100 потоков, но я не могу сделать с разветвлением нескольких потоков. Это я делаю в Perl и использую модуль CPAN потоков для того же.

1 Ответ

2 голосов
/ 08 февраля 2012

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

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

sub write_child_output_to_file {
   my ($msg, $file) = @_;
   open my $fh, '>>', $file;
   flock $fh, 2;
   seek $fh, 0, 2;
   print $fh $msg;
   close $fh;
}

Модуль Forks::Super имеет функции, которые могут обрабатывать эти детали для вас:

use Forks::Super;
use Data::Dumper;
my %foo;
for my $i (1 .. 5) {
    fork {
        share => [ \%foo ],
        sub => {
            # the code that will run in each child process.
            # Updates to the variable  %foo  in the child will be
            # available to the parent when the child finishes
            ...
        }
    };
}
waitall;
print "Data produced in all the children: ",
    Data::Dumper::Dumper(\%foo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...