具有多个阻塞观察程序的 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(),但目前无法将其放入事件循环中。

另外,我想添加某种形式的与程序的交互,可能通过套接字(另一个观察者)。

谢谢

事件系统的想法不是编写阻止等待一个特定事件的线性代码,而是为事件发生时要执行的操作设置处理程序,然后等待这些事件中的任何一个发生。事件发生时,事件框架通常会调度到这些事件处理程序。然后,诀窍是设置处理程序,然后等待它。

EV和AnyEvent都将支持这种事情。另外要看的是POEIO::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方法在适当的时间调度到事件处理程序。

也许你正在尝试做这样的事情?

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::Notify 的代码片段只是一种方法。基本上,无论您的框架如何,它几乎总是相同的方式:使用回调设置观察器并进入"主循环"。

相关内容

  • 没有找到相关文章

最新更新