イベント駆動プログラミングに関連するPerlモジュールメモ
- AnyEvent
- AnyEvent::FIFO
- Async::Queue
- AnyEvent::Debounce
- AnyEvent::Retry
- AnyEvent::Tools
- AnyEvent::Worker
- Test::AnyEvent::Time
- Async::Hooks
- Async::Defer
- Async::MergePoint
- Async::Group
- Combinator
- Object::Event
- Event::Notify
- Notification::Center
- Class::Publisher
- Object::Deferred
- Data::Monad::CondVar
- Async::Util
- CPS
- Future
AnyEvent †
- http://search.cpan.org/~mlehmann/AnyEvent/
- コールバックモデルによるイベント駆動フレームワーク
- 複数のイベントループ実装に対応し、共通のAPIを提供する。
AnyEvent::FIFO †
- http://search.cpan.org/~dmaki/AnyEvent-FIFO/
- 汎用ジョブキュー。
- 非同期ジョブをつっこむと順次実行してくれる。
- 並列度を調節可能。
Async::Queue †
- http://search.cpan.org/perldoc?Async%3A%3AQueue
- AnyEvent::FIFOと同様、非同期ジョブを並列度制限しながら実行する
- ただし、AnyEvent::FIFOは基本的に複数の異なる非同期処理をFIFO実行するようになっているが、 Async::Queueはあらかじめ登録した一つの非同期処理を(引数を変えながら)何度も実行するといったユースケースを想定している。
- ぶっちゃけ、async.jsのqueueオブジェクトのパクり
AnyEvent::Debounce †
- http://search.cpan.org/~jrockway/AnyEvent-Debounce/
- 時間的に近い複数のイベントをまとめて一つのイベントとして扱い、コールバックをキックする。
- TCPのdelayed ACKのようなことをやりたい時に便利そう。
AnyEvent::Retry †
- http://search.cpan.org/~jrockway/AnyEvent-Retry/lib/AnyEvent/Retry.pm
- 非同期コールを成功するまで時間を置いて勝手にリトライしてくれるオブジェクト
AnyEvent::Tools †
- http://search.cpan.org/~unera/AnyEvent-Tools/
- 非同期ルーチンのmutex, object pool, forループ, bufferなど。
- object poolは複数のobjectを複数の非同期ルーチンで取り合う場合に使う。 うまく使えばセマフォも実現できそう。
- bufferは任意のデータを蓄積するキューバッファ。 flushを手動でトリガするか、自動トリガがかかるかするとbuffer内のデータがコールバックに渡される。 AnyEvent::Debounceに近い動作も実現できそう。
AnyEvent::Worker †
- http://search.cpan.org/~mons/AnyEvent-Worker/
- ワーカーサブプロセス。
- 見たところ、1オブジェクト = 1プロセスとなり、常駐するタイプ。
Test::AnyEvent::Time †
- http://search.cpan.org/~toshioito/Test-AnyEvent-Time/lib/Test/AnyEvent/Time.pm
- AnyEventを使った非同期ルーチンが制限時間内に終了するかどうかをテスト
- 終了しなかったらタイムアウトして先に進む
- 指定した時間以上かかるかどうかのテストとかもできる
Async::Hooks †
- http://search.cpan.org/~melo/Async-Hooks/
- 複数の非同期コールを束ねて逐次実行するオブジェクト。
- オブジェクトにフックを登録するときに使える。
- 逐次実行を開始する際には引数とコールバックを与えることができ、それぞれの非同期コールに同じ引数が与えられる。
- 全ての非同期コールが終了するとコールバックが呼ばれる。途中で非同期コールチェーンの実行をスキップしてコールバックを呼ぶこともできる。
Async::Defer †
- http://search.cpan.org/~powerman/Async-Defer/
- 複数の非同期コールを束ねて逐次実行するオブジェクト。
- 単に上から下に実行するだけではなく、非同期コールのif分岐、whileループ、try/catchによる例外処理なんかをサポート。
- Async::Deferオブジェクトの入れ子も可能。
- 入れ子にした複数のAsync::Deferオブジェクトの並列実行も可能。
- 「複数の非同期コールを〜〜する」系のタスクはこれ一つでたいていの用事がすみそうな気がする。
- ただし条件分岐を本格的にやりだすとコードがかなり複雑化する。
Async::MergePoint †
- http://search.cpan.org/~pevans/Async-MergePoint/
- 予め指定したフラグが全て立った瞬間に指定したコールバックを実行する。
- 並列に走る非同期ルーチンのマージポイントとなる
Async::Group †
- http://search.cpan.org/~ddumont/Async-Group/
- 複数の非同期コールを並列(同時)実行し、全て終了したタイミングでコールバックを実行する。
- 各非同期コールの結果は集約されてコールバックに渡される。
- 集約のやり方は、(1)結果のlogical AND, (2)結果の文字列結合 のいずれかもしくは両方のみなので、汎用性は低い。
Combinator †
- http://search.cpan.org/~cindy/Combinator/
- 複数の非同期コールを逐次実行する。
- 最大の特徴はソースフィルタリングを使っており、DSLっぽく非同期コールのチェーンを記述する点。
- 簡単な繰り返し処理もサポート。
Object::Event †
- http://search.cpan.org/~elmex/Object-Event/
- コールバック関数を登録するようなオブジェクトを作る際の基本クラス。
- Node.jsで言う所のEventEmitterのようなもの。
Event::Notify †
- http://search.cpan.org/~dmaki/Event-Notify/lib/Event/Notify.pm
- シンプルなNotifierオブジェクト
- register_eventメソッドでobserverオブジェクトを特定のイベント名に登録
- notifyメソッドで指定したイベントを発報。引数をとれる。
Notification::Center †
- http://search.cpan.org/~rlb/Notification-Center/lib/Notification/Center.pm
- Objective-CのNotificationCenterのクローン
- addメソッドでobserverを追加、notifyメソッドでイベント発報。
Class::Publisher †
- http://search.cpan.org/~simonflk/Class-Publisher/lib/Class/Publisher.pm
- notifier(publisher)オブジェクトのベースクラス
- Class::Observableを元にしているが、特定のイベントのみsubscribeできるところが違うらしい。
Object::Deferred †
- http://search.cpan.org/dist/Object-Deferred/
- CommonJSのpromise API実装らしい。
- then()メソッドで成功(resolved)コールバックと失敗(rejected)コールバックを登録。
- コールバックは複数登録できそう。
- resolve()メソッドで成功をシグナル、reject()メソッドで失敗をシグナル。すると対応するコールバックが実行される。
- シグナル済みのオブジェクトにthen()メソッドでコールバックを登録すると即座に起動。
Data::Monad::CondVar †
- http://search.cpan.org/dist/Data-Monad-CondVar/
- AnyEvent::Condvarを拡張し、JSDeferredのような機能を実現
- 非同期関数を、CVから値をrecvして新たなCVを返す関数とみなす
- JSDeferredにおけるDeferredオブジェクトを拡張CVで実装したイメージ、か?
- もともと圏論におけるモナドのモデルに当てはめてAPIなどが切られているので、実際に使って練習してみないと使い方が難しそう。
- 参考
- http://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%8A%E3%83%89_%28%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%29
- http://perl-users.jp/articles/advent-calendar/2011/hacker/14
- http://d.hatena.ne.jp/hiratara/20111012/1318386007
- http://www.slideshare.net/hiratara/monads-in-perl
- http://d.hatena.ne.jp/m-hiyama/20060419/1145432492
Async::Util †
- http://search.cpan.org/perldoc?Async%3A%3AUtil
- 非同期ルーチンの逐次実行や非同期ルーチンによるmapなどのユーティリティ関数
CPS †
- http://search.cpan.org/perldoc?CPS
- CPS(Continuation Passing Style)によるプログラミングを支援する各種関数群を定義。
- Continuation Passingによるループ、木構造トラバース、逐次・並列実行など
- イベント駆動プログラムと相性がいい
CPS::Functional †
- http://search.cpan.org/perldoc?CPS%3A%3AFunctional
- CPSによるmap, grep, reduceなどの実装
Future †
- http://search.cpan.org/perldoc?Future
- jQueryのDeferredオブジェクトに似たオブジェクト。よって前述のObject::Deferredとも似てる
- on_done()メソッドで成功時コールバックを登録、on_fail()メソッドで失敗時コールバックを登録。
- コールバックは複数登録できる。
- on_ready()メソッドで成功・失敗に関わらず実行されるコールバックを登録。
- done()メソッドで成功状態に変更し、成功時コールバックを実行。fail()メソッドで失敗状態に変更し、失敗時コールバックを実行。
- cancel()メソッドが呼ばれると、あらかじめon_cancel()メソッドで登録されたルーチンが起動。実行中の処理を中断するために使える。