当睡眠()不能很好地报警时,我还可以做什么'睡眠'?

Wil*_*hou 6 perl sleep alarm

有许多文件说"你应该避免使用带闹钟的睡眠,因为许多系统都使用闹钟来实现睡眠".实际上,我遇到了这个问题.那么当睡眠()无法正常使用警报时,是否有人可以帮助我,我可以做什么'睡眠'?我已经尝试了'usleep'的Time :: HiRes模块和select()函数.但它们也没有用.

DrH*_*yde 5

鉴于您被闹钟打断,因此无法可靠地使用 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)


Eug*_*ash 1

你可以试试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)