名前

Mojo::Reactor - 低レベルのイベントリアクターの基底クラス

使い方

package Mojo::Reactor::MyEventLoop;
use Mojo::Base 'Mojo::Reactor';

$ENV{MOJO_REACTOR} ||= 'Mojo::Reactor::MyEventLoop';

sub io         {...}
sub is_running {...}
sub one_tick   {...}
sub recurring  {...}
sub remove     {...}
sub start      {...}
sub stop       {...}
sub timer      {...}
sub watch      {...}

1;

説明

Mojo::Reactorは、 Mojo::Reactor::EVMojo::Reactor::Poll のような 低レベルのイベント装置のための抽象基底クラスです。

イベント

Mojo::Reactorは、Mojo::EventEmitterを継承しており、 次の新しいイベントを発行することができます。

error

$reactor->on(error => sub {
  my ($reactor, $err) = @_;
  ...
});

コールバックの中で例外をキャッチするために、このイベントが発行されます。 もし処理されなければ、致命的です。 イベントが処理できなかった場合あるいは、失敗した場合は、 プログラムをキルするかもしれないので、注意してください。 十分注意して使用してください。

$reactor->on(error => sub {
  my ($reactor, $err) = @_;
  say "Something very bad happened: $err";
});

メソッド

Mojo::ReactorはすべてのメソッドをMojo::EventEmitterから継承しており、 次の新しいメソッドを実装しています。

again

$reactor->again($id);

アクティブなタイマーを再開始します。 サブクラスでオーバーライドされます。 このメソッドはアクティブなタイマーが必要であることに注意してください。

detect

my $class = Mojo::Reactor->detect;

もっともよい利用可能なウォッチャーの実装を検知し、ロードします。 MOJO_REACTOR環境変数の値か、Mojo::Reactor::EVMojo::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 {...});

できるだけ早くコールバックを呼び出します がリターンする前ではありません。 いつでもundefを返却します。

one_tick

$reactor->one_tick;

イベントが起こるか、イベントがもはや監視されなくなるまで、リアクターを実行します。 このメソッドはリアクターに制御を戻すので、気をつけて使う必要があります。 サブクラスでオーバーロードされます。

# 0.5秒以上はブロックしない
my $id = $reactor->timer(0.5 => sub {});
$reactor->one_tick;
$reactor->remove($id);

recurring

my $id = $reactor->recurring(0.25 => sub {...});

新しい再燃タイマーを生成します。 与えられた秒数の後に、繰り返しコールバックが呼び出されます。

# できるだけはやく呼び出す
$reactor->recurring(0 => sub { say 'Reactor tick.' });

remove

my $bool = $reactor->remove($handle);
my $bool = $reactor->remove($id);

ハンドル、あるいはタイマーを削除します。 サブクラスでオーバーロードされます。

reset

$reactor->reset;

すべてのハンドルとタイマーを取り除きます。 サブクラスでオーバーロードされることが予定されています。

start

$watcher->start;

I/Oの監視とタイマーイベントを開始します。 これはstopが呼び出されるまでブロックします。 いくつかのリアクターは、 監視されるイベントがなくなれば、 自動的に停止することに注意してください。 サブクラスでオーバーロードされます。

# すでに実行されていないときだけ、リアクターを開始する。
$reactor->start unless $reactor->is_running;

stop

$watcher->stop;

I/O監視とタイマーイベントを停止します。 サブクラスでオーバーロードされます。

timer

my $id = $reactor->timer(0.5 => sub {...});

新しいタイマーを生成します。 与えられた秒数の後にコールバックが呼び出されます。 サブクラスでオーバーロードすることが予定されています。

watch

$reactor = $reactor->watch($handle, $readable, $writable);

I/Oイベントのためのハンドルを監視します。

# 読み込み可能なイベントだけを監視する
$reactor->watch($handle, 1, 0);

# 書き込み可能なイベントだけを監視する
$reactor->watch($handle, 0, 1);

# 読み込み可能あるいは書き込み可能なイベントを監視する
$reactor->watch($handle, 1, 1);

# イベントの監視を停止する
$reactor->watch($handle, 0, 0);

参考

Mojolicious, Mojolicious::Guides, http://mojolicio.us.

(Mojolicious 8.12を反映。更新日は2019年5月27日)

関連情報