1

在并行处理“事物”时,我一直在使用以下模板来满足我的所有分叉/流程需求。它基本上循环遍历我需要处理的所有内容,一次 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 孩子。

有没有办法修改我的代码来做到这一点?

4

1 回答 1

2

无论何时alarm都可能是片状的,这是穷人警报的一个很好的用例:

my $pid = fork();
if ($pid == 0) {
    ...  # child code
    exit;
}
if (fork() == 0) {
    my $time = 15;
    exec($^X, "-e", "sleep 1,kill(0,$pid)||exit for 1..$time;kill -9,$pid");
    die; # shouldn't get here 
}

第一个fork触发您的子进程。第二个fork是运行一个进程以在$time几秒钟后杀死第一个进程。

于 2013-04-05T19:57:00.743 回答