Upgrade to Pro — share decks privately, control downloads, hide ads and more …

go

Avatar for xorphitus xorphitus
February 04, 2015

 go

go な並行処理の中身を紐解いてみました。
(Golang, clojure.core.async)

Avatar for xorphitus

xorphitus

February 04, 2015
Tweet

More Decks by xorphitus

Other Decks in Programming

Transcript

  1. (let [ch (chan)] (go (while true (let [val (<! ch)]

    (println val)))) (go (>! ch “hello world”)))
  2. Go

  3. 並行処理の俯瞰図(たぶん) 協調マルチタスク Python、Lua、あたりが主? ECMA6 でもやろうと思えば 共有メモリ ロック 例のあれ STM ClojureやらHaskellやら

    メッセージ パッシング アクター Scalaやら Erlangやら CSP/π計算 ベース Goやら Clojureのcore.asyncやら C# async やら
  4. Go の並行処理 (goroutine) CSP (Communicating Sequential Processes) および π計算 (pi-calculus)

    の2つを混ぜて作った並行処理、らしい チャネル渡しの概念はπ計算のもの、らしい
  5. CSP と π計算 どちらもプロセス代数の一種 プロセス代数っていうのは • 並行システムを代数で表現したもの • メッセージパッシング •

    代数式を解くことで並行処理の恒等的性質を明 らかにする、らしい ◦ これ、デッドロックするんじゃね?とか
  6. CSP 自販機の例 自販機はコインを入れてジュースが出て止まる VendingMachne = coin -> juice -> STOP

    人間はコインまたはカードでの支払いを選択し、止まる Person = (coin -> STOP)□(card -> STOP) 自販機と人間を並列化すると VendingMachine|[{coin, card}]|Person ≡ coin -> juice -> STOP 上記を何やかんやすると、自販機・人間の並列プロセスから (juice -> STOP)□STOP ジュースを出して止まる、または単に止まる、非決定性プロセスが得られる
  7. goroutine のイメージ(たぶん) coroutine 0 thread 0 coroutine 1 blocking thread

    1 coroutine 1 scheduler call call yield 待機状態の coroutineを 移動! 別スレッドにて coroutine 0 を 待たずに続行
  8. go (Clojure) のイメージ (go (...) (...)) macro expansion (go (...)

    (...)) macro expansion thread task 0 task 1 チャネルへの 入力待ち チャネルに 入力 IOC スレッドと言う
  9. go (Clojure) のイメージ thread チャネルへの 入力待ち チャネルに 入力 state 待ちになったら

    state を他所で維持しつつ スレッド上の処理から 除外する チャネルへの入力が あったら 元の状態にリジュームして 処理を継続する
  10. OSおよび軽量スレッド/イメージ図 multi thread (OS) lightweight thread lightweight thread for multi

    core サーバアーキテクチャで、まずイベント駆動が流行して その後コア数に合わせてイベント駆動プロセスを立ち上げるのが出てきた経緯に似てるなあ
  11. IOバウンドな処理だと • OSのスレッドを使った方がよい • 軽量スレッドだと処理がブロックされる • IO waitのコストがコンテキストスイッチのコスト を上回る •

    ので、多量に並列するならスレッド上限が多く なっていることは確認しておく core.async なら thread マクロでそれでき(ry
  12. まとめ • go な並行処理はスッキリ記述できて嬉しい • CPUリソースも無駄なく使えて嬉しい • ただしマルチコアによる並「列」化は意識してお く •

    そしてIOバウンドな処理にも気をつける • あと、go マクロでステート・マシンに展開すると かヤバい