2009-12-24

[perl] 今日から始める AnyEvent

AnyEvent とは

これまで、イベントドリブンフレームワークの実装には、POE, Danga::Socket, EV, Event などいろいろあって、互換性もなく混乱した状況でした。

AnyEvent はそういう諸々の API を、データベースへの API で考えられた DBI の様に抽象化したもので、具体的な実装には依存せず、どの(Any)イベントドリブンフレームワークを用いても、同じコードで動きます。今後は AnyEvent で書いておけば安心です。

基本的な考え方

  1. イベントハンドラにコールバック関数を登録します。
    具体的には、on_readみたいなところに関数リファレンスを入れておく。
  2. イベントループを回します。
    具体的には、$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