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