2012-05-22 57 views
2

我想弄清楚在Perl中的事件循環?perl事件循環與多個阻止觀察者?

目前我的程序做這樣的事情:

while(my $event = wait_for_event()){ 
     handle_event($event); 
     try_to_do_something(); 
    } 

其中wait_for_event阻止。

我想弄清楚我是否可以使用EV或AnyEvent(AE)或其他方法添加另一個事件觀察者。

例如,我希望能夠每2秒調用一次try_to_do_something(),但我現在堅持把它放入事件循環中。

此外,我想添加某種形式的與程序的交互,可能通過套接字(另一個觀察者)。

感謝

回答

1

也許你正在嘗試做這樣的事情?

use AnyEvent; 
use AnyEvent::Filesys::Notify; 

sub try_to_do_something { say "every two seconds" } 
sub handle_event { say $_->path." ".$_->type for @_ } 

my $n = AnyEvent::Filesys::Notify->new(
    dirs => ['/tmp'], 
    interval => 0.5, 
    filter => sub { 1 }, 
    cb => sub { handle_event(@_) }, 
); 
my $w = AE::timer 0, 2, sub {try_to_do_something}; 

AnyEvent->condvar->recv; 

這個片段與AnyEvent和AnyEvent :: ::的filesys通知僅僅是一個辦法做到這一點。基本上,它幾乎總是以相同的方式,無論你的框架:用你的回調設置你的觀察者,並輸入你的「主循環」。

5

與事件系統的想法是不寫的線性代碼,等待一個特定的事件塊,而是建立處理程序,當事件發生時該怎麼做,然後等待這些事件的發生。事件發生時,事件框架通常會派發給這些事件處理程序。接下來的訣竅就是設置處理程序,並等待它。

EV和AnyEvent都支持這樣的事情。還有要看的東西是POE,IO::AsyncReflex

其中任何一個概念都大致相同,但我會舉一個IO::Async的例子,因爲我知道它是最好的,主要是因爲我寫了它。

use IO::Async::Loop; 
use IO::Async::Timer::Periodic; 

my $loop = IO::Async::Loop->new; 

$loop->add(IO::Async::Timer::Periodic->new(
    interval => 2, 
    on_tick => \&try_to_do_something 
)->start); 

# Perhaps here you'd add your socket watcher, using an 
# IO::Async::Handle or ::Stream or something else 

$loop->run; 

$loop->add方法安裝了一個通知對象進入循環,在這種情況下是,每2秒運行指定的函數的週期性定時器。在程序的底部,主要的$loop->run方法會在適當的時候分派給事件處理程序。

+0

我目前正在使用File :: ChangeNotify,我不確定如何將該觀察者添加到上面的任何事件處理程序。謝謝 – Smartelf