2016-08-16 18 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); 
}