Perl Time::HiRes - 替换常规警报的最佳方式
Perl Time::HiRes - the best way to replace regular alarm
我需要在 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);
吗?或者我应该以某种方式调整上面的行?我还没有找到任何明显的例子。
好的,我仍然有一些小问题,但我怀疑它们是否与 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
你完全可以按照你说的去做。您需要做的就是在调用代码之前加载 Time::HiRes 并导入 alarm
。但请不要将其直接放在代码上方,到处都是 use
语句不是一个好习惯。属于顶级。
The Time::HiRes doc 说(强调我的):
alarm ( $floating_seconds [, $interval_floating_seconds ] )
The SIGALRM signal is sent after the specified number of seconds. Implemented using setitimer() if available, ualarm() if not. The $interval_floating_seconds argument is optional and will be zero if unspecified, resulting in alarm()-like behaviour. This function can be imported, resulting in a nice drop-in replacement for the alarm provided with perl, see the "EXAMPLES" below.
然后 this example(逐字引用)很好地表明您现在可以在 alarm
中使用浮点值。
use Time::HiRes qw ( time alarm sleep );
$now_fractions = time;
sleep (2.5);
alarm (10.6666666);
我需要在 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);
吗?或者我应该以某种方式调整上面的行?我还没有找到任何明显的例子。
好的,我仍然有一些小问题,但我怀疑它们是否与 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
你完全可以按照你说的去做。您需要做的就是在调用代码之前加载 Time::HiRes 并导入 alarm
。但请不要将其直接放在代码上方,到处都是 use
语句不是一个好习惯。属于顶级。
The Time::HiRes doc 说(强调我的):
alarm ( $floating_seconds [, $interval_floating_seconds ] )
The SIGALRM signal is sent after the specified number of seconds. Implemented using setitimer() if available, ualarm() if not. The $interval_floating_seconds argument is optional and will be zero if unspecified, resulting in alarm()-like behaviour. This function can be imported, resulting in a nice drop-in replacement for the alarm provided with perl, see the "EXAMPLES" below.
然后 this example(逐字引用)很好地表明您现在可以在 alarm
中使用浮点值。
use Time::HiRes qw ( time alarm sleep );
$now_fractions = time;
sleep (2.5);
alarm (10.6666666);