Perl MCE return 散列数据到主进程

Perl MCE return hash data to main process

我正在尝试运行运行良好的 Perl 众核引擎。但是,当工作人员将数据添加到子例程中的全局哈希时,一旦 MCE 进程完成,该数据就会丢失(请参阅下面的注释位置)。我认为这不会成为问题,因为 %data 是全球性的。非常感谢任何建议。

#!/usr/bin/perl
use strict;
use warnings;
use MCE;

my @symbol = ('abc','def');
my $CPUs = 1;
my %data = ();

process();

sub process {
    my $mce = MCE->new(
        input_data  => \@symbol,
        max_workers => $CPUs,
        user_func => sub {
            my ($self, $sym, $chunk_id) = @_;
            $sym = $sym->[0];
            doTask($sym);
        }
    );
    $mce->run();

    print %data; # if I check contents of %data at this line in the code, its empty
}

sub doTask {
    my ($sym) = @_;
    $data{$sym} = 1;

    print %data;
    print "\n\n";

    return;
}

doTask 实际上 运行 吗?它 looks like user_func 应该是 user_tasks:

的一部分
my $mce = MCE->new(
    input_data  => \@symbol,
    user_tasks  => [{
        max_workers => $CPUs,
        user_func   => sub {
            my ($self, $sym, $chunk_id) = @_;
            $sym = $sym->[0];
            doTask($sym);
    }]
);
$mce->run();

使用具有内置数据收集功能的 MCE::Map 模型工作正常。

#!/usr/bin/perl
use strict;
use warnings;
use MCE::Map;

my @symbol = ('abc','def');
my $CPUs = 1;
my %data = ();

process();

sub process {
    MCE::Map::init {chunk_size => 1, max_workers => $CPUs};
    %data = mce_map {doTask($_)} @symbol;
    print %data; # data exchange between the manager and worker processes works
}

sub doTask {
    my ($sym) = @_;
    $data{$sym} = 1;
    return %data;
}

到return或者所有线程之间共享一个复杂的结构,比如array的hash of hash,MCE foreach,或者MCE::Loop,with gather都测试不工作。 MCE::Map 也没有。唯一经过测试的工作方式是通过 threads::share,通过递归添加共享子层,如 http://www.perlmonks.org/?node_id=798735 所示,并使用 shared_clone 作为结束分配。

# the following lines cannot be ommitted otherwise error "Invalid value for shared scalar"
unless (exists $HoH{$F[0]})
{
my %p : shared;
$HoH{$F[0]} = \%p;
}
# the following lines if skipped will randomly missing a few records
unless (exists $HoH{$F[0]}{$mf})
{
    my @c : shared;
    $HoH{$F[0]}{$mf} = \@c;
}  
$HoH{$F[0]}{$mf}=shared_clone([$F[3],$F[4]]);
#we cannot use $HoH{$mf}=shared_clone(\%Loss) directly, where %Loss is a hash of arrary

顺便说一句,此方法仅在 运行 作为独立脚本时有效,如果 运行 从不允许 "use threads::shared" 之前的 "use threads" 的 perl 调试器中进行 运行,将 return 空值。

支持深度共享的完整数据共享功能将包含在即将发布的 MCE 1.7 版本中。

use MCE;
use MCE::Shared;

mce_share my %data;

散列在支持进程和线程的工作人员之间共享。