NeverBlockの話
ちょっと思うところがあってrubyはじめました。
eventletライクなものを作ってみようかなと思ってイチのイチからrubyを勉強中です。
とりあえずrubyだとNeverBlockっていうのがあるようです。
http://steps.dodgson.org/?date=20080920
基本の考え方はeventletと同じ。協調スレッドでI/O待ちが発生するとスイッチする考え。
だけど上の内容を見るとNeverBlockはまだSocketを置き換えてないっぽい。
non-blockingを意識させないような仕組みにはまだなってないようだ。
まあ多分今後実装されると思われるけど仕組み的には
- socketを作ると同時にnon_blockingにする
- socketにaccept、readなど、操作する(チャレンジ)
- 問題なければそのまま処理続行
- errorが出てerrnoがEWOULDBLOCK(35だったはず)だった場合は中心のepoll、kequeueに監視を依頼する(同時に読み書き可能になった際に呼ばれるコールバックを仕込む)
- 待ちなのでスイッチする。スイッチ先はhubに当たるmainloopがいるFiber
- hubでイベント発生
- コールバックを呼ぶ
- コールバック内でスイッチ元のFiberへスイッチする
- socket操作をして続行
って感じになるはずだけど。
基本的にこの手は中心にあるはずのhubとかreactorになるものを置いてI/O待ちとかtrampolineでmainloopと行き来してぐるぐる回すはずなんだけど
NeverBlockは真ん中にいる人がイマイチ見えないなあ。
まあなので自作です。
pythonでは実装した事あるから割とすぐできるかと思ったけどpythonに慣れすぎてruby難しく感じちゃう><