我正在尝试使用 Parallel::ForkManager 来控制一些子进程。我想将同时运行的进程数限制为 10。我总共需要运行 20 个。
我知道我可以在对象声明的第一行将进程限制设置为 10,但我也使用 $pm 对象来运行执行不同操作的子进程(当前函数占用更多内存,因此需要加以限制)。
我目前的代码不起作用,永远不会调用完成时运行,所以剩下的 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();