【问题标题】:Perl Time::HiRes - the best way to replace regular alarmPerl Time::HiRes - 替代常规闹钟的最佳方式
【发布时间】:2015-08-13 06:13:07
【问题描述】:

我需要在 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); 吗?或者也许我应该以某种方式调整上面的行?我没有找到任何明显的例子。

【问题讨论】:

  • 你试过了吗? :)
  • @simbabque 已经是了 :) 我有点(非常)悲观,但是在更仔细地阅读了文档之后,我也明白了那些行(“这个函数可以导入......”) .谢谢!

标签: perl timeout alarm time-hires


【解决方案1】:

你可以完全按照你说的去做。您需要做的就是在调用代码之前加载 Time::HiRes 并导入 alarm。但请不要将它直接放在代码上方,到处都有use 语句不是一个好习惯。它属于顶部。

The Time::HiRes doc 说(强调我的):

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2017-01-31
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多