ovn*_*tar 3 parallel-processing perl
我试图使用Parallel :: ForkManager来运行并行,但遗憾的是子例程并行不返回任何条目.
sub parallel {
my ($self,$values) = @_;
my %hash;
my $pm = Parallel::ForkManager->new(200);
foreach my $IP ( keys %{$values} ) {
my $pid = $pm->start and next;
$hash{$IP}=$self->getData($IP);
$pm->finish(0, \$hash{$IP});
}
$pm->wait_all_children;
return %hash;
}
print Dumper( parallel(%data) );
Run Code Online (Sandbox Code Playgroud)
我做错了什么?有任何想法吗?
分叉是创建一个新流程,它是当前流程的副本.在一个进程中更改变量不会在其他进程中更改类似命名的变量.
您修改了子进程%hash,但是您正在转储父进程的进程%hash.
P :: FM确实提供了一种将数据传递回父进程的机制.它记录在"从子进程中检索DATASTRUCTURES"标题下.
use Data::Dumper qw( Dumper );
use Parallel::ForkManager qw( );
use constant MAX_WORKERS => 200;
my %hash;
my $pm = Parallel::ForkManager->new(MAX_WORKERS);
$pm->run_on_finish(sub {
my ($pid, $exit_code, $ident, $exit_signal, $core_dump, $result_ref) = @_;
my $IP = $ident;
warn("Child $IP killed by signal $exit_signal"), return if $exit_signal;
warn("Child $IP exited with error $exit_code"), return if $exit_code;
warn("Child $IP encountered an unknown error"), return if !$result_ref;
$hash{$IP} = $$result_ref;
});
for my $IP (keys %$values) {
my $pid = $pm->start($IP) and next;
$pm->finish(0, \$self->getData($IP));
}
$pm->wait_all_children();
print(Dumper(\%hash));
Run Code Online (Sandbox Code Playgroud)