在并行处理“事物”时,我一直在使用以下模板来满足我的所有分叉/流程需求。它基本上循环遍历我需要处理的所有内容,一次 X 个条目,并且超时任何需要太长时间的条目:
my $num_procs = 0;
foreach my $entry (@entries) {
$num_procs++;
if($num_procs == $MAX_PROCS) {
wait();
$num_procs--;
}
my $pid = fork();
if($pid == 0) {
process($entry);
}
}
for (; $num_procs>0; $num_procs--) {
wait();
}
“进程”例程具有以下模板,该模板使进程超时:
my $TIMEOUT_IN_SECONDS = 15;
eval {
local $SIG{ALRM} = sub { die "alarm" };
alarm($TIMEOUT_IN_SECONDS);
# do something
alarm(0);
};
if ($@) {
# do something about the timeout
}
我现在遇到了一个问题,因为孩子无法超时,所以这不再有效。(我认为这是由于 NFS 的 I/O 阻塞问题造成的)我认为解决这个问题的唯一方法是让父母自己杀死 -9 孩子。
有没有办法修改我的代码来做到这一点?