2種類考えられる
- IO多重化(epoll/kqueue/etc..)
read(2)/write(2)が非同期
read(2)した順番に返ってくるとは限らない
read(2)してるあいだはブロック
- asynchronous socket(O_NONBLOCK)
read(2)じたいブロックしない
fdのreadが終わらないあいだに他のfdの処理にうつるかもしれない
この2つを組み合わせるのが多い
いわゆるイベントドリブンなのを類型化
勝手に呼んでる
- 生eventloop系(node.js,twisted,eventmachine)
非同期なコードを強いられる
callback地獄
下に書いてあるような仕組みを拡張とかで使えるのもある
node.js + fiber(コルーチン)
inlineCallbacks(twisted, コルーチン)
em-synchrony(eventmachine, コルーチン)
- evenlet系(eventlet,gevent,meinheld,haskell)
いわゆるコルーチン+IO多重化(+asynchronous socket)で並列
軽量スレッドで非同期を隠蔽
同期的な書き方で非同期コード混ぜれる
ブロックするようなDBドライバ使ってても軽量スレッド切り替えてIO待ちの無駄なくせる
python(greenlet, shrapnel) haskell(軽量スレッド)
Goもこの仲間になるか?
- akka系(akka,celluloid,erlang)
アクターモデルを使う
一つの大きなIOのためのループ(akkaであればnio)と各アクターがそれぞれやりとり
アクターは状態を共有しない、メッセージのやりとりがコールバックのかわり
同期的なコードに非同期を混ぜれる?(まあ指向性は違う)
- async/await系(C#)
同期っぽいコードかいたらコンパイラが頑張ってイベントドリブンなのと同じものを生成する
生成されるコードじたいはかわらない
並列?