[perl] 今日から始める AnyEvent
AnyEvent とは
これまで、イベントドリブンフレームワークの実装には、POE, Danga::Socket, EV, Event などいろいろあって、互換性もなく混乱した状況でした。AnyEvent はそういう諸々の API を、データベースへの API で考えられた DBI の様に抽象化したもので、具体的な実装には依存せず、どの(Any)イベントドリブンフレームワークを用いても、同じコードで動きます。今後は AnyEvent で書いておけば安心です。
基本的な考え方
- イベントハンドラにコールバック関数を登録します。
具体的には、on_readみたいなところに関数リファレンスを入れておく。 - イベントループを回します。
具体的には、$cv = AE::cv でcondvarを作って、$cv->recv で処理をブロックしておけばよい。
AnyEvent->condvar がピンとこない
Condition variable? 状態は送信前と送信後の2つあります。ボンバーマンで考えると、リモコンボムです。具体的には、爆発する前の状態と、リモコンを使って爆発させた後の状態の2つです。送信側は、$cv->send
受信側は、$cv->recv (届くまでブロック) または、$cv->cb($cb) (届いたら$cb->($cv)が実行される)
AE と AnyEvent の違いが良くわからん
AE の方が改良版の高速なAPIです。AnyEvent->condvar と AE::cv
$w = AnyEvent->timer(after => $after, interval => $interval, cb => $cb) と $w = AE::timer($after, $interval, $cb)
以上の関係を覚えればだいたいOK
hello world
こんな感じでいかがでしょうか。helloが出て、1秒後に world が出ます。use strict;
use warnings;
use AnyEvent;
my $done = AE::cv;
my $t = AE::timer 1, 0, sub {
print "world\n";
$done->send;
};
print "hello\n";
$done->recv;
あとは公式ドキュメントを読む
まずは、AnyEvent::Intro詳細は、AnyEvent
コメント
コメントを投稿