在Perl中做超时的方法?

kno*_*orv 20 perl timeout

我经常使用以下模式设置Perl中特定代码片段的运行时间的上限:

my $TIMEOUT_IN_SECONDS = 5;
eval {
    local $SIG{ALRM} = sub { die "alarm\n" };
    alarm($TIMEOUT_IN_SECONDS);
    # do stuff that might timeout.
    alarm(0);
};
if ($@) {
    # handle timeout condition.
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

  • 这是正确的方法吗?
  • 是否有任何情况下运行时间可能超过$ TIMEOUT_IN_SECONDS,或上述方法是防弹?

cjm*_*cjm 10

你可能想看看Sys :: SigAction.我自己没有用它,但它有一些发光的评论.

需要注意的一件事是"可能超时的东西"是否使用sleepalarm本身.此外,在错误处理代码中,我假设您已准备好除超时之外的错误.


Pet*_*rch 5

您也可以尝试Time::Out。我喜欢这种语法,并且支持嵌套超时。