如果花费太长时间,我如何停止Perl子程序?

时间:2015-01-22 21:12:31

标签: perl subroutine

我在Perl中创建了一个子例程sub_info。所以在我的Perl脚本中,它读取输入文件的每一行并调用sub_info子例程。但是,对于某些输入行,sub_info需要很长时间才能运行。所以基本上我想计算每个输入行的sub_info子程序的运行时间,如果需要超过15分钟,我想传递该输入行并为下一个输入行运行sub_info子程序。是否有任何函数来计算在Perl中运行子程序的时间?

1 个答案:

答案 0 :(得分:2)

我可能会使用SIG{ALRM}alarm的某种组合:

use warnings;
use strict;

$|=1;

for my $i (1 .. 10) {

  local $SIG{ALRM} = sub {
    die;
  };

  eval {
    alarm 5;
    sub_info($i);
  };

  if ($@) {
    print "aborted\n";
  }
  alarm 0;
}

sub sub_info {
  my $i = shift;
  my $r = int(10*rand);

  printf "Trying %2d for %2d seconds: ", $i, $r;
  sleep $r;
  print "finished\n";
}

使用alarm n指定在n秒后将SIGALRM信号传递给调用进程。当进程收到这样的信号时,它执行$SIG{ALRM}中指定的操作。在上面的示例脚本中它就死了。

因此,如果sub_info调用的时间少于5秒,则不会调用die,但如果调用次数较多,则会调用die

您不希望整个过程死亡,因此您将调用sub_info包裹到eval块中。如果eval块已经死亡,则将设置$@。因此,您要检查$@中的真值,在这种情况下,您知道超过了5秒。