有许多文件说"你应该避免使用带闹钟的睡眠,因为许多系统都使用闹钟来实现睡眠".实际上,我遇到了这个问题.那么当睡眠()无法正常使用警报时,是否有人可以帮助我,我可以做什么'睡眠'?我已经尝试了'usleep'的Time :: HiRes模块和select()函数.但它们也没有用.
鉴于您被闹钟打断,因此无法可靠地使用 sleep() 或 select(),我建议将 Time::HiRes::gettimeofday 与 select() 结合使用。
这是一些我没有测试过的代码。它应该能够抵抗信号的干扰,并且会休眠所需的秒数加上最多 0.1 秒。如果你愿意消耗更多的 CPU 周期而不做任何事情,你可以使分辨率更好:
...
alarm_resistant_sleep(5); # sleep for 5 seconds, no matter what
...
use Time::HiRes;
sub alarm_resistant_sleep {
my $end = Time::HiRes::time() + shift();
for (;;) {
my $delta = $end - Time::HiRes::time();
last if $delta <= 0;
select(undef, undef, undef, $delta);
}
}
Run Code Online (Sandbox Code Playgroud)
你可以试试AnyEvent:
use AnyEvent;
my $cv = AnyEvent->condvar;
my $wait_one_and_a_half_seconds = AnyEvent->timer(
after => 1.5,
cb => sub { $cv->send }
);
# now wait till our time has come
$cv->recv;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2409 次 |
| 最近记录: |