tokuhirom's Blog

オススメCPANモジュールその1。 AnyEvent

というわけで、俺の独断と偏見によるオススメモジュールのコーナーです。

AnyEvent は poll/select/kqueue/epoll(4) などのイベントループを抽象化するライブラリです。似たような目的のものとして Danga::Socket, POE などがありますが、ライブラリ全体のインターフェースの完成度や速度などの点から AnyEvent を僕は一番押しています。

Pure Perl で利用できますし、インターフェースも安定しています。まだバリバリ開発されてますが、backward incompat な変更はされないようです。

作者が mlehmann 氏ということで、ドキュメントは丁寧ですが攻撃的な文章が目立ちますし、バグレポートすると異常な長文がかえってきたりするのでうっとーしかったりしますが、コードの品質はたかいので、気にする必要はないかとおもいます。コードの品質の前では多少の攻撃的な発言は些事であるといえるでしょう。

AnyEvent は昨年の春ぐらいから本格的に日本ではやりはじめて、YAPC::Asia 以後、海外でも再評価されてるような感じをうけます。
日本語の解説エントリがたくさんあるので、ググって適当に覚えればわりと簡単につかえるようになるでしょう。

似たようなモジュール

POE

ポゥとよまないといけない、などとわけのわからないことを言われるのがうっとーしいのでつかわないようにしています。というのは冗談ですが、POE をつかうには POE の作法にしたがわなくてはいけなくて、かつ POE の作法が結構めんどくさい。POE::Component::Client::HTTP などをつかう場合、response の処理なんて callback function をつかえばいいとおもうのですが、そのための event を定義してやらなければならなかったりします。

$_[ARG0] などの POE でしかつかわれていない異様な記法で引数を渡しているあたりもいただけません。当時はこれによる高速化の効果もあったのかもしれませんが、今となっては意味がありませんし、ネットワークプログラミングにおいて引数の処理はボトルネックになるわけがないので、うっとーしいだけです。POE::Sugar::Args をつかえばこの点を緩和させることができますが、AnyEvent にくらべてまわりくどいことにかわりはないとおもいます。

また、コードが読みづらく、とてもじゃないけど読む気がしないのも難点です。ポゥワールドなコードなので、かなりとっつきづらいし、1つのファイルの中でいろんな package 宣言がでてきたりするので、とっともおいづらいです。

一方で、大量の POE::Component は強みです。具体的には POE::Component::IRC が人気がたかいです。

元々、POE を汎用的なイベントループとして使っている人は日本ではすくなくて、PoCo(POE::Component の略)をつかうと便利だよねー、といった程度の人がおおく、より具体的には「POE って IRC ボット書くのにつかうやつでしょ?」ぐらいの人が一番おおかった気がします。

現在では AnyEvent::IRC があります。これは POE::Component::IRC よりとっつきやすくておすすめです。

なお、いまでも POE::Component::* の中には AnyEvent には移植されてないものがあるので、そういうものをつかう場合には POE を使う方がいいでしょう。その場合には AnyEvent::Impl::POE をつかえば AnyEvent 経由でつかえたりします(AnyEvent::Impl::POE は bit buggy ですが)。

Danga::Socket

Danga::Socket は、Perlbal, Djabbered, Gearman などでつかわれている汎用的なイベントループライブラリです。コードは読みやすいし、つかいやすいのですが、作者の想定外の使い方をするとハマるという、例のアレがありますし、ドキュメントがすくないし使ってる人もすくないのでオススメできません。

機能的にも AnyEvent などにくらべると簡素です。ちょっとこったことしようとすると AnyEvent が欲しくなるかとおもいます。