【问题标题】:Perl fork manager get the output variable after completing the forkingPerl fork manager 完成分叉后获取输出变量
【发布时间】:2016-08-16 17:41:40
【问题描述】:

我对 Perl Parallel Fork 管理器非常陌生。这是代码,

    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;”有什么我需要做的吗?

任何帮助将不胜感激。

【问题讨论】:

  • 谁能说明为什么这个问题被否决了?

标签: linux perl parallel-processing fork


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多