Mojo::Reactor

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);

你可能感兴趣的:(Mojo::Reactor)