Skip to content

Instantly share code, notes, and snippets.

@kubo39
Created March 23, 2013 17:33
Show Gist options
  • Save kubo39/5228602 to your computer and use it in GitHub Desktop.
Save kubo39/5228602 to your computer and use it in GitHub Desktop.
非同期プログラミングめも

非同期とか並列とか

いわゆる非同期

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#)

同期っぽいコードかいたらコンパイラが頑張ってイベントドリブンなのと同じものを生成する

生成されるコードじたいはかわらない

並列?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment