Perl Time::HiRes -取代常规闹钟的最佳方式



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

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);吗?或者我应该调整一下上面的线条?

你完全可以照你说的去做。您所需要做的就是在调用代码之前加载Time::HiRes并导入alarm。但是请不要把它直接放在代码上面,到处都是use语句不是好的做法。它属于顶端。

The Time::HiRes文档说(强调我的):

alarm ($floating_seconds [, $interval_floating_seconds])

SIGALRM信号在指定秒数后发送。如果可用,使用setitimer()实现,如果不可用,使用ualarm()实现。$interval_floating_seconds参数是可选的,如果未指定,将为零,导致类似alarm()的行为。这个函数可以导入,从而可以很好地替换perl提供的警报,参见下面的"示例"。

然后,这里有一个例子(逐字引用),很好地表明您现在可以在alarm中使用浮点值。

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

好的,我仍然有一些小问题,但我怀疑它们与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

相关内容

  • 没有找到相关文章

最新更新