Perl Time :: HiRes - 替换常规闹钟的最佳方式

时间:2015-08-13 06:13:07

标签: perl timeout alarm time-hires

我需要在DBIx :: HA包中实现少于一秒的超时。从该模块获得以下代码:

my $timeout = 0;
eval {
    no strict;
    my $h = set_sig_handler(
        'ALRM', 
        sub { $timeout = 1; die 'TIMEOUT'; },
        { mask=>['ALRM'], safe=>1 }
    );
    alarm($DATABASE::conf{_getdbname($dsn)}->{'connecttimeout'});
    $dbh = DBI->connect($dsn, $username, $auth, $attrs);
    alarm(0);
};

我知道有一个核心的Perl模块Time :: HiRes,但我之前从未使用它。它还有一个alarm()子 - 我可以在上面的行之前插入use Time::HiRes qw (alarm);吗?或者也许我应该以某种方式调整上面的行?我没有找到任何明显的例子。

2 个答案:

答案 0 :(得分:1)

好的,我还有一些小问题,但我怀疑它们与Time :: HiRes有关,而且总的来说以下解决方案确实有效:

use Time::HiRes qw (alarm); # Just adding this line.... ;)
my $timeout = 0;
eval {
    no strict;
    my $h = set_sig_handler(
        'ALRM', 
        sub { $timeout = 1; die 'TIMEOUT'; },
        { mask=>['ALRM'], safe=>1 }
    );
    alarm($DATABASE::conf{_getdbname($dsn)}->{'connecttimeout'});
    $dbh = DBI->connect($dsn, $username, $auth, $attrs);
    alarm(0);
};

很高兴知道! :d

答案 1 :(得分:1)

你可以完全按照你说的做。您需要做的就是在调用代码之前加载Time :: HiRes并导入alarm。但请不要直接将其放在代码之上,在整个地方发表use语句并不是一种好的做法。它属于顶级。

The Time::HiRes doc说( emphazis mine ):

  

alarm($ floating_seconds [,$ interval_floating_seconds])

     

SIGALRM信号在指定的秒数后发送。如果可用,使用setitimer()实现,否则使用ualarm()。 $ interval_floating_seconds参数是可选的,如果未指定则为零,从而导致类似alarm()的行为。 可以导入此功能,从而为perl提供的警报提供了一个很好的替代,请参阅"示例"下方。

稍后会有this example(引用逐字),很好地表明您现在可以使用alarm的浮点值。

use Time::HiRes qw ( time alarm sleep );
$now_fractions = time;
sleep (2.5);
alarm (10.6666666);