Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AnyEvent timer question

How could I make "visible" the timer? This example returns (intependent from the sleep-time always) 2 (I expected something similar to the sleep-time).

#!/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;
like image 641
sid_com Avatar asked Jul 28 '11 06:07

sid_com


2 Answers

There are at least two problems:

  • sleep 5 doesn't run the event loop.
  • Your callback triggers the cond. variable. If, for instance, you removed the sleep 5 statement, $c would only be 1.

Is this what you want?

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;
like image 84
ErikR Avatar answered Oct 04 '22 03:10

ErikR


The event loop is not running (well nothing is running) while sleep is "active". So no event registered with AnyEvent can be triggered.

The rule: If you use AnyEvent (or any other ansynchronous framework), never use sleep.

See user5402's answer for the correct solution.

like image 43
dolmen Avatar answered Oct 04 '22 03:10

dolmen