我正在编写的一段代码使用Parallel :: ForkManager,并且我注意到它在脚本运行时正在创建许多僵尸。我想知道我是否缺少一些东西wait_all_children
。
my $fork_manager = new Parallel::ForkManager->($ENV{CPUS})
for(my $i = 0; $i < scalar @plates; $i++){
my $offset = get_full_plate_offsets(@{$plates[$i]});
make_path(File::Spec->catfile($tmp_dir, $i));
foreach my $cell (keys %{$offset}){
my($x, $y) = @{$offset->{$cell}};
$fork_manager->start("$cell @ $x, $y") and next;
my $out_file = File::Spec->catfile($tmp_dir, $i, "$cell.jpg");
my $out_text = File::Spec->catfile($tmp_dir, $i, "$cell.txt");
split_file($input_jpg, [$x, $y], $out_file);
my $result = do_something($out_file);
open(my $FH, '>', $out_text);
print $FH "$result\n";
$fork_manager->finish;
}
$fork_manager->wait_all_children;
}
也是一个澄清的问题。僵尸总是坏的吧?
起初,我给人的印象是,僵尸进程只是尚未被其父级恢复的进程。现在我想知道我的代码是否根本不等待孩子。
P :: FM仅在start
被调用且正在运行的最大子代数以及何时wait_children
或被wait_all_children
调用时才会收获。在那之前退出的孩子会变成僵尸。
您所拥有的孩子(包括僵尸)将永远不会超过指定的数量,因此临时出现僵尸并不是一件坏事[1]。唯一的问题是run_on_finish
处理程序仅在获得子进程时才会执行,因此这表明不会尽快调用该处理程序。
我相信您可以使用以下方式早日收获孩子:
$SIG{CHLD} = sub { $pm->wait_children };
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句