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;
散列在支持进程和线程的工作人员之间共享。
我正在尝试运行运行良好的 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;
散列在支持进程和线程的工作人员之间共享。