2010-01-15

[perl] AnyEvent::Handle を使ってみて気づいたこと

AnyEvent::Handle を使って困ったことや気づいたことについて。

on_read や push_read していない場合など、read watcher が止まっている時は、クライアント切断時に on_error や on_eof が即座には呼ばれず、push_write した時になる。さらに、push_write しなければ、ずっとエラーを検出できない。対策: あらかじめ手動で start_read しておく。

AnyEvent::Handle 内に独自の wbuf (write buffer), rbuf (read buffer) を持っているので、いったん使い始めたら、途中で使うのをやめる時には注意が必要。

push_shutdown は on_drain を黙って上書きする。on_read と push_read は別々に存在できて、push_read したキューがなくなったら on_read になるのにちょっと困る。内部に read queue のような write queue が存在しないことを理解すれば仕方ないと分かる。