2013-10-30 3 views
2

Parallel :: ForkManager를 사용하여 병렬 처리를 진행하려고하지만 불행히도 서브 루틴 병렬이 항목을 반환하지 않습니다.Perl Parallel :: ForkManager empty return

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

관련 문제