linux - Perl fork manager 在完成 fork 后获取输出变量

标签 linux perl parallel-processing fork

我对 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;

这就是问题所在, fork 在这里工作得很好。但问题是我无法收集 foreach 循环外部的数据。但同时,我能够在“$forking->finish”之前收集

我需要对“$forking->finish;”做些什么吗?

如有任何帮助,我们将不胜感激。

最佳答案

$pm->start$pm->finish 之间的所有内容都在父级的 fork 中执行。您将添加到子级的 @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);
}

关于linux - Perl fork manager 在完成 fork 后获取输出变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38981252/

相关文章:

xml - 根据数组中数据的匹配更新 XML 文件的特定节点

perl - 在 perl 中使用\和 {},[] 引用变量有什么区别?

perl - Perl中<=>(小于,等于,大于)的含义?

c - Arduino 上的并行执行

linux - 如何使用 awk 和 bash 检查文本文件中的字段是否为空

sql - Postgres 不允许 localhost 但可以使用 127.0.0.1

c - 同时使用 rand() 和 rand_r() : is this simple example correct?

c# - 我的积分算法是否正确?我们还可以在并行处理和效率方面提高这一点吗?代码在 C# 中

linux - 混帐/Linux : What is a good strategy for maintaining a Linux kernel with patches from multiple Git repositories?

c - linux c 中的信号?