【问题标题】:How can I stop a Perl subroutine if it takes too long?如果 Perl 子例程花费的时间太长,我该如何停止它?
【发布时间】:2015-03-21 20:02:30
【问题描述】:

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

【问题讨论】:

  • 投票重新开放。这不是关于分析的问题。

标签: perl subroutine


【解决方案1】:

我可能会选择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 秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-29
    • 2017-03-03
    • 2019-03-16
    • 1970-01-01
    • 2015-11-28
    • 2016-12-28
    • 2014-01-05
    • 2010-11-12
    相关资源
    最近更新 更多