Mojo::Reactor 是低層事件驅(qū)動(dòng)器的基類吧慢。通過子類Mojo::Reactor::EV和Mojo::Reactor::Poll兩個(gè)類進(jìn)行具體的實(shí)現(xiàn)。
支持的事件
Mojo::Reactor 繼承了 Mojo::EventEmitter的全部事件,并實(shí)現(xiàn)了error 事件。
$reactor->on(error => sub {
my ($reactor, $err) = @_;
...
});
如果是未處理的致命異常, 會(huì)調(diào)用這個(gè)錯(cuò)誤回調(diào)。需要注意的是, 如果本次事件是未處理或失敗, 你的程序會(huì)被終止系羞,所以需要非常小心的處理這個(gè)事件。
方法
Mojo::Reactor 繼承了Mojo::EventEmitter中的所有方法霸琴,并實(shí)現(xiàn)了以下方法椒振。
again
$reactor->again($id);
重啟 timer,需要$id指向的timer處理活動(dòng)狀態(tài)梧乘。調(diào)用這個(gè)方法后會(huì)使ID為$id的timer重新執(zhí)行澎迎。
detect
my $class = Mojo::Reactor->detect;
用于發(fā)現(xiàn)和檢查最合適的可用的事件驅(qū)動(dòng)器類。首先嘗試環(huán)境變量 MOJO_REACTOR 的值选调,比如:Mojo::Reactor::EV 或 Mojo::Reactor::Poll夹供。
# 實(shí)例化最合適的事件驅(qū)動(dòng)器類
my $reactor = Mojo::Reactor->detect->new;
io
$reactor = $reactor->io($handle => sub {...});
監(jiān)控I/O句柄事件,當(dāng)事件是可讀或可寫的時(shí)間仁堪,調(diào)用回調(diào)罩引。
# 回調(diào)將被調(diào)用兩次,如果句柄即可讀取或者寫入
$reactor->io($handle => sub {
my ($reactor, $writable) = @_;
say $writable ? 'Handle is writable' : 'Handle is readable';
});
is_running
my $bool = $reactor->is_running;
檢查事件驅(qū)動(dòng)器是否正在運(yùn)行中枝笨。
next_tick
my $undef = $reactor->next_tick(sub {...});
在下一次事件驅(qū)動(dòng)周期結(jié)束前調(diào)用回調(diào),也就是盡快調(diào)用回調(diào)函數(shù)揭蜒。
one_tick
$reactor->one_tick;
運(yùn)行事件驅(qū)動(dòng)器横浑,直到有事件發(fā)生。這個(gè)方法可能會(huì)進(jìn)入事件循環(huán)屉更,所以調(diào)用時(shí)要注意徙融。
# 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 {...});
創(chuàng)建一個(gè)循環(huán)的timer,在指定的間隔時(shí)間調(diào)用回調(diào)。
remove
my $bool = $reactor->remove($handle);
my $bool = $reactor->remove($id);
刪除句柄或timer瑰谜。
reset
$reactor->reset;
刪除全部句柄或者timer
start
$reactor->start;
開始監(jiān)控I/O和timer事件并阻塞欺冀,直到stop方法被調(diào)用树绩,需要注意的是,有些反應(yīng)堆在沒有事件時(shí)會(huì)自動(dòng)停止隐轩。
# 只有當(dāng)它尚未運(yùn)行的時(shí)候, 啟動(dòng)反應(yīng)堆
$reactor->start unless $reactor->is_running;
stop
$reactor->stop;
停止監(jiān)控I/O和timer事件饺饭。
timer
my $id = $reactor->timer(0.5 => sub {...});
創(chuàng)建一個(gè)新的timer,在指定時(shí)間后調(diào)用回調(diào)职车。
watch
$reactor = $reactor->watch($handle, $readable, $writable);
對(duì)于I/O事件創(chuàng)建監(jiān)控瘫俊,指定true和false值,注意只能對(duì)一個(gè)活動(dòng)的I/O進(jìn)行監(jiān)控悴灵。
# 監(jiān)控只讀事件
$reactor->watch($handle, 1, 0);
# 監(jiān)控寫事件
$reactor->watch($handle, 0, 1);
# 監(jiān)控可讀和可寫
$reactor->watch($handle, 1, 1);
# 停止監(jiān)控事件
$reactor->watch($handle, 0, 0);