5

我怎样才能使计时器“可见”?这个例子返回(总是独立于睡眠时间)2(我期望类似于睡眠时间的东西)。

#!/usr/local/bin/perl
use warnings;
use 5.014;
use AnyEvent;

my $c = 0;
my $cv = AnyEvent->condvar;

my $once_per_second = AnyEvent->timer (
    after => 0,
    interval => 1,
    cb => sub {
        $c++;
        $cv->send;
    },
);

sleep 5;

$cv->recv;

say $c;
4

2 回答 2

6

至少有两个问题:

  • sleep 5不运行事件循环。
  • 您的回调触发条件。多变的。例如,如果您删除了该sleep 5语句,则$c只会是 1。

这是你想要的吗?

my $c = 0;
my $cv = AnyEvent->condvar;
my $once_per_second = AnyEvent->timer(after => 0, interval => 1, cb => sub { $c++ });
my $five_seconds = AnyEvent->timer(after => 5, cb => sub { $cv->send });
$cv->recv;
say $c;
于 2011-07-28T07:18:03.697 回答
3

事件循环在“活动”时没有运行(没有任何东西在运行)sleep。所以无法触发任何使用 AnyEvent 注册的事件。

规则:如果你使用AnyEvent(或任何其他异步框架),永远不要使用sleep.

有关正确解决方案,请参阅 user5402 的答案。

于 2012-09-04T16:01:50.350 回答