Perl Parallel::ForkManager 空返回

4

我正在尝试使用Parallel::ForkManager来并行运行程序,但不幸的是,子例程parallel没有返回任何条目。

 sub parallel {
   my ($self,$values) = @_;
   my %hash;
   my $pm = Parallel::ForkManager->new(200);
   foreach my $IP ( keys %{$values} ) { 
    my $pid = $pm->start and next;
    $hash{$IP}=$self->getData($IP);
    $pm->finish(0, \$hash{$IP});
   }
   $pm->wait_all_children;
   return %hash;
  }



print Dumper( parallel(%data) );

我做错了什么?有什么想法吗?
1个回答

7

分叉是创建一个当前进程的副本的新进程。在一个进程中更改变量不会更改其他进程中同名的变量。

您修改了子进程的%hash,但却正在转储父进程的%hash

P::FM提供了一种机制来将数据传递回父进程。它在“从子进程检索数据结构”标题下记录

use Data::Dumper          qw( Dumper );
use Parallel::ForkManager qw( );

use constant MAX_WORKERS => 200;

my %hash;

my $pm = Parallel::ForkManager->new(MAX_WORKERS);
$pm->run_on_finish(sub {
   my ($pid, $exit_code, $ident, $exit_signal, $core_dump, $result_ref) = @_;

   my $IP = $ident;

   warn("Child $IP killed by signal $exit_signal"), return if $exit_signal;
   warn("Child $IP exited with error $exit_code"),  return if $exit_code;
   warn("Child $IP encountered an unknown error"),  return if !$result_ref;

   $hash{$IP} = $$result_ref;
});

for my $IP (keys %$values) { 
   my $pid = $pm->start($IP) and next;
   $pm->finish(0, \$self->getData($IP));
}

$pm->wait_all_children();

print(Dumper(\%hash));

相关帖子:http://stackoverflow.com/questions/3090531/perl-parallelforkmanager-doesnt-allow-to-collect-variable-values?rq=1 - ovntatar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接