2016-08-16 47 views
-1

我对Perl Parallel Fork管理器非常陌生。这里是代码,Perl分叉管理器在完成分叉之后获得输出变量

my $max_procs = 3; 
    my $forking = Parallel::ForkManager->new($max_procs); 

    my @collect_processed_data; 
    foreach my $row (@data_array) { 

     $forking->start and next; 

     # Code processing -- Started 

     push(@collect_processed_data, $obtained_data); 

     # where $obtained_data is an array which we get it from DB. 

     # Code Processing -- Ended. 

     #print Dumper @collect_processed_data; --> Works here. 

     $forking->finish; # do the exit in the child process 

    } 

    $forking->wait_all_children; 

    print Dumper @collect_processed_data; --> But not working here; 

这是问题,分叉在这里工作正常。但是我无法收集在foreach循环外部收集数据的问题。但与此同时,我可以在“$ forking-> finish”之前收集数据。

我需要用“$ forking-> finish”做什么?

任何帮助,将不胜感激。

+0

任何人都可以提出为什么这个问题得到了投票? – Raja

回答

3

$pm->start$pm->finish之间的所有内容均在父项的分支中执行。您将添加到孩子的副本@collect_processed_data,但打印父母的@collect_processed_data

P :: FM提供了一种将数据返回给父级的机制,该机制记录在标题为“RETRIEVING DATASTRUCTURES from child processes”的标题下。

my $pm = Parallel::ForkManager->new($max_procs); 

my @collect_processed_data; 
$pm->run_on_finish(sub { 
    my ($pid, $exit_code, $ident, $exit_signal, $core_dump, $processed_data) = @_; 

    if ($exit_signal) { warn("$pid killed by signal $exit_signal\n"); } 
    elsif ($exit_code) { warn("$pid exited with error $exit_code\n"); } 

    push @collect_processed_data, $processed_data 
     if defined($processed_data); 
}); 

for (...) { 
    $pm->start and next; 
    ... 
    my $processed_data = ...; 
    ... 
    $pm->finish(0, $processed_data); 
}