2011-07-28 65 views
5

我怎樣才能讓「可見」計時器?這個例子返回(始終與睡眠時間相關)2(我預計類似於睡眠時間)。AnyEvent計時器問題

#!/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; 

回答

6

至少有兩個問題:

  • sleep 5不會運行事件循環。
  • 您的回調會觸發cond。變量。例如,如果您刪除了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; 
+0

我還不明白爲什麼使用'sleep'我得到2而不是1. –

+0

您正在爲「after => 0」獲取一個回調,然後在第一個區間獲得一個回調。嘗試創建計時器而不指定「之後」並查看$ c是否爲1。 – ErikR

3

事件循環沒有運行(以及任何正在運行),而sleep是「積極的」。所以沒有任何註冊AnyEvent的事件可以觸發。

規則:如果您使用AnyEvent(或任何其他ansynchronous框架),從不使用sleep

請參閱user5402的正確答案。