我正在尝试使用Parallel::ForkManager来控制一些子进程。我希望将同时运行的进程数量限制为10个。总共需要运行20个进程。
我知道我可以在对象声明的第一行设置进程限制为10,但我也使用$pm对象来运行执行不同操作的子进程(当前函数需要更多的内存,因此需要限制)。
我目前的代码无法正常工作,run on finish调用从未被执行,因此剩余的10个子进程从未被分叉。我不明白为什么会出现这种情况——我认为子进程仍然会在退出时调用完成代码并减少计数,但“if”语句似乎阻止了这一点。有人能解释一下为什么吗?
感谢任何帮助!
我知道我可以在对象声明的第一行设置进程限制为10,但我也使用$pm对象来运行执行不同操作的子进程(当前函数需要更多的内存,因此需要限制)。
我目前的代码无法正常工作,run on finish调用从未被执行,因此剩余的10个子进程从未被分叉。我不明白为什么会出现这种情况——我认为子进程仍然会在退出时调用完成代码并减少计数,但“if”语句似乎阻止了这一点。有人能解释一下为什么吗?
感谢任何帮助!
# Parallel declarations
my $pm = Parallel::ForkManager->new(30);
$pm->run_on_finish(sub {
my ($pid, $exit_code, $ident, $exit_signal, $core_dump, $data_str_ref) = @_;
--$active_jobs;
})
my $total_jobs = 0;
my $active_jobs = 0;
while( $total_jobs < 20) {
sleep 300 and next if $active_jobs > 10;
my $pid = $pm->start and ++$active_p1_jobs and ++$total_p1_jobs and next;
my $return = module::function(%args);
$pm->finish(0, { index => $total_jobs, return => $return });
}
print STDERR "Submitted all jobs, now waiting for children to exit.\n";
$pm->wait_all_children();
perl script.pl | wc -l
) - ikegami$type2_count
。如果我添加my $pid = $pm->start and ++$type2_count and next;
,我会陷入无限循环中。 - distracted-biologistwait_all_children
中复制一些代码。 - ikegami