Perl модуль paralle :: forkmanager - PullRequest
       2

Perl модуль paralle :: forkmanager

1 голос
/ 07 августа 2011

У меня есть большой массив около 10000 данных, и я хочу обработать его с помощью parallel :: forkmanager

Как я могу обработать данные на чанке 1000 У меня есть следующий код:

my $MAX_PROCESSES = 10;

 my  $pm = new Parallel::ForkManager($MAX_PROCESSES);

    for (<>) {
       my $pid = $pm->start and next; 
      #  here i want to process my data on chunks of 1000 with 10 parallel::formanagaer
       $pm->finish; 
         }

Как я могу настроить свой код, чтобы сделать это?

Ответы [ 2 ]

3 голосов
/ 07 августа 2011

Как показывают документы, данные передаются от родительского к дочернему, поэтому вы хотите что-то, имеющее следующую форму:

for (;;) {
   ... get a chunk ...
   my $pid = $pm->start and next; 
   ... process chunk ...
   $pm->finish; 
}

So

use constant CHUNK_SIZE => 1000;

CHUNK:    
for (my $eof = 0; !$eof;) {
   my @chunk;
   while (@chunk < CHUNK_SIZE) {
      my $line = <>;
      if (!$line) {
         if (@chunk) {
            $eof = 1;  # Can't rely on a handle returning EOF twice.
            last;      #   so we have to make a note of it.
         } else {
            last CHUNK;
         }
      }

      push @chunk, $line;
   }

   my $pid = $pm->start and next; 
   ... process chunk ...
   $pm->finish; 
}
0 голосов
/ 06 июня 2014
my $max_procs = 4;
my $pm = new Parallel::ForkManager($max_procs);

foreach my $index ( 0 .. $max_procs-1 ) {
    my $cmd = $$cli_to_execute[$index];

    # Forks and returns the pid for the child:
    my $pid = $pm->start($index) and next;

    my $out = &cli_command( $cmd ) unless $pid; ### This code is the child process

    $pm->finish($index, \$out); # pass an exit code to finish
}

print "Waiting for children...\n";
$pm->wait_all_children;
...