gpt4 book ai didi

Perl Parallel::ForkManager 空返回

转载 作者:行者123 更新时间:2023-12-01 10:51:17 25 4
gpt4 key购买 nike

我正在尝试使用 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) );

我做错了什么?有任何想法吗?

最佳答案

fork 是创建一个新进程,它是当前进程的副本。更改一个进程中的变量不会更改其他进程中名称相似的变量。

您修改子进程的 %hash ,但您正在转储父进程的 %hash .

P::FM 确实提供了一种将数据传回父进程的机制。它是 documented在“从子进程中检索数据结构”标题下。

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

关于Perl Parallel::ForkManager 空返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19694852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com