2013-10-30 100 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