Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

NeverBlockの話

ちょっと思うところがあってrubyはじめました。
eventletライクなものを作ってみようかなと思ってイチのイチからrubyを勉強中です。

とりあえずrubyだとNeverBlockっていうのがあるようです。
http://steps.dodgson.org/?date=20080920

基本の考え方はeventletと同じ。協調スレッドでI/O待ちが発生するとスイッチする考え。
だけど上の内容を見るとNeverBlockはまだSocketを置き換えてないっぽい。
non-blockingを意識させないような仕組みにはまだなってないようだ。

まあ多分今後実装されると思われるけど仕組み的には

  1. socketを作ると同時にnon_blockingにする
  2. socketにaccept、readなど、操作する(チャレンジ)
  3. 問題なければそのまま処理続行
  4. errorが出てerrnoがEWOULDBLOCK(35だったはず)だった場合は中心のepoll、kequeueに監視を依頼する(同時に読み書き可能になった際に呼ばれるコールバックを仕込む)
  5. 待ちなのでスイッチする。スイッチ先はhubに当たるmainloopがいるFiber
  6. hubでイベント発生
  7. コールバックを呼ぶ
  8. コールバック内でスイッチ元のFiberへスイッチする
  9. socket操作をして続行

って感じになるはずだけど。

基本的にこの手は中心にあるはずのhubとかreactorになるものを置いてI/O待ちとかtrampolineでmainloopと行き来してぐるぐる回すはずなんだけど
NeverBlockは真ん中にいる人がイマイチ見えないなあ。

まあなので自作です。
pythonでは実装した事あるから割とすぐできるかと思ったけどpythonに慣れすぎてruby難しく感じちゃう><