Вопрос о таймере AnyEvent - PullRequest
5 голосов
/ 28 июля 2011

Как я могу сделать «видимым» таймер? Этот пример возвращает (зависит от времени сна всегда) 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;

Ответы [ 2 ]

6 голосов
/ 28 июля 2011

Есть как минимум две проблемы:

  • 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;
3 голосов
/ 04 сентября 2012

Цикл событий не запущен (ну, ничего не работает), пока sleep "активен".Поэтому никакое событие, зарегистрированное в AnyEvent, не может быть инициировано.

Правило : если вы используете AnyEvent (или любую другую асинхронную среду), никогда не используйте sleep.

См. Правильный ответ пользователя user5402.

...