Mojo::Reactor 是低层事件驱动器的基类。通过子类Mojo::Reactor::EV和Mojo::Reactor::Poll两个类进行具体的实现。
支持的事件
Mojo::Reactor 继承了 Mojo::EventEmitter的全部事件,并实现了error 事件。
$reactor->on(error => sub {
my ($reactor, $err) = @_;
...
});
如果是未处理的致命异常, 会调用这个错误回调。需要注意的是, 如果本次事件是未处理或失败, 你的程序会被终止,所以需要非常小心的处理这个事件。
方法
Mojo::Reactor 继承了Mojo::EventEmitter中的所有方法,并实现了以下方法。
again
$reactor->again($id);
重启 timer,需要$id指向的timer处理活动状态。调用这个方法后会使ID为$id的timer重新执行。
detect
my $class = Mojo::Reactor->detect;
用于发现和检查最合适的可用的事件驱动器类。首先尝试环境变量 MOJO_REACTOR 的值,比如:Mojo::Reactor::EV 或 Mojo::Reactor::Poll。
# 实例化最合适的事件驱动器类
my $reactor = Mojo::Reactor->detect->new;
io
$reactor = $reactor->io($handle => sub {...});
监控I/O句柄事件,当事件是可读或可写的时间,调用回调。
# 回调将被调用两次,如果句柄即可读取或者写入
$reactor->io($handle => sub {
my ($reactor, $writable) = @_;
say $writable ? 'Handle is writable' : 'Handle is readable';
});
is_running
my $bool = $reactor->is_running;
检查事件驱动器是否正在运行中。
next_tick
my $undef = $reactor->next_tick(sub {...});
在下一次事件驱动周期结束前调用回调,也就是尽快调用回调函数。
one_tick
$reactor->one_tick;
运行事件驱动器,直到有事件发生。这个方法可能会进入事件循环,所以调用时要注意。
# Don't block longer than 0.5 seconds
my $id = $reactor->timer(0.5 => sub {});
$reactor->one_tick;
$reactor->remove($id);
recurring
my $id = $reactor->recurring(0.25 => sub {...});
创建一个循环的timer,在指定的间隔时间调用回调。
remove
my $bool = $reactor->remove($handle);
my $bool = $reactor->remove($id);
删除句柄或timer。
reset
$reactor->reset;
删除全部句柄或者timer
start
$reactor->start;
开始监控I/O和timer事件并阻塞,直到stop方法被调用,需要注意的是,有些反应堆在没有事件时会自动停止。
# 只有当它尚未运行的时候, 启动反应堆
$reactor->start unless $reactor->is_running;
stop
$reactor->stop;
停止监控I/O和timer事件。
timer
my $id = $reactor->timer(0.5 => sub {...});
创建一个新的timer,在指定时间后调用回调。
watch
$reactor = $reactor->watch($handle, $readable, $writable);
对于I/O事件创建监控,指定true和false值,注意只能对一个活动的I/O进行监控。
# 监控只读事件
$reactor->watch($handle, 1, 0);
# 监控写事件
$reactor->watch($handle, 0, 1);
# 监控可读和可写
$reactor->watch($handle, 1, 1);
# 停止监控事件
$reactor->watch($handle, 0, 0);