ninjinkun's diary

ninjinkunの日記

EventをバックエンドにするとAE::nowはキャッシュされない

Coro::Selectを使っているプロジェクトで、イベントループをEventからEVに換えたところ、GETの際にタイムアウトが頻繁に起こるようになりました。社内で指摘されてから気づいたのですが、どうやらこちらの問題だったようです。
http://d.hatena.ne.jp/tokuhirom/20090918/1253267536
Coro::Selectの内部ではAE::timerでタイムアウトを監視していますが、このtimerのスタート時刻がキャッシュされた古い時間の場合、タイムアウトが想定より早くやってくることになります。デフォルトではEVがバックエンドになると思いますので、注意が必要です。

ただ、AE::timerを内部で使っている実装でも、イベントループにEventを使っている限りはこの問題は発生しないようです。Coro::Select等、Coro::AnyEventを内部で使うモジュールでは、EventよりもバックエンドにEVを使う方がスレッドの切り替えなどが高速ですが、自分の仕事の範囲ではイベントループ自体の性能はあまり問題にならないことが多いので、特に必要が無い限りはEventを使っていこうと思います。(クローラ等の場合はCoro::EVの方が良いと思います)