2013-10-30 61 views
2

我想使用Parallel :: ForkManager运行并行,但不幸的是子程序并行不返回任何条目。Perl并行:: ForkManager空返回

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)); 

我做错了什么?有任何想法吗?

回答

4

分叉是创建一个新过程,它是当前过程的副本。在一个进程中更改变量不会更改其他进程中类似命名的变量。

您修改了子进程的%hash,但您正在倾销父进程的%hash

P :: FM确实提供用于传递数据返回给父进程的机构。它的标题是“从子进程中检索数据结构”标题下的documented

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)); 
+0

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

+0

更新答案添加代码。 – ikegami