取代常规警报的最佳方法

我需要在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声明。 它属于最高层。

Time :: HiRes doc说( emphazis mine ):

警报($ 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

链接地址: http://www.djcxy.com/p/59223.html

上一篇: the best way to replace regular alarm

下一篇: perl MakeMaker's version