非同期プログラミング
養成ギブスとしてのnode.js
niryuu<niryuu@gmail.com>

14年2月28日金曜日
自己紹介
• プログラミング初心者
• C→Python→PHP→node.js
• Android,iOS
• 地理情報システムの会社
• 皆さん、酒飲んでて下さい
14年2月28日金曜日
私と非同期プログラミング
•

PHPでWebアプリケーションフレームワークを使ってやっていた→非同
期とは無縁

•

iOS/Android:まあHTTP通信とかNSOperationQueueとかAsyncTaskとかいろ
いろ非同期プログラミングが登場する場面はあるが、イディオムに従っ
ていた感じ

•
•
•
•

14年2月28日金曜日

要はわかっていない
node.jsで非同期プログラミングをやっていくことで、教訓を得ていった
koaとかQとかがあるが、実際どうなっているのか
Webの話をするが、他のことでも本質的に変わらないと思う
ざっくりと記述すると
•
•
•
•
•

非同期処理をやる前の処理(Context A)
非同期処理(Context B)
やった後の処理(Context A)
Thread でも Event Loop でも変わらない
継続とかの議論は省く(とはいっても、コルーチン
などが事実上使われ始めているので、無視はでき
ないが)

14年2月28日金曜日
何で難いか
•

一旦元のコンテキストから切り離して、戻っ
てくるので、処理がリニアではない(非同期処
理を言い換えてるだけじゃん!)

•
•
•
14年2月28日金曜日

concurrentとかparallelとかその辺の議論は勘弁
切り離すのはOK
どう戻ってくるか
戻すのをマズると
どうやばいか
•
•

終わった/失敗した非同期処理、終わらない実行
非同期がないなら、処理が成功したらいけるしダメだったらた
だ死ぬのだが、そうでないのでデバッグが大変

•

node.jsの場合→プロセスが1つなので、死んだら終わり(実際の
ところ passenger とかで解決可能であるが、望ましくはない)

•
•
•
14年2月28日金曜日

clusterで4つ立ち上げたら、4つとも刺さって死んだ
→デバッグが大変
複数の非同期処理が混在してると、さらにわけわからなくなる
コールバックによる方法
• hidouki(arg1, arg2,.. ,cb)
• hidouki を呼ぶコンテキストと、cbが実
行されるコンテキストが同じ

• とてもわかりやすい
• しかし
14年2月28日金曜日
コールバック地獄
•
•
•

省略(みなさんお分かりでしょう)
要約すると「▶」
問題:コードが汚い

•

コードの汚さが記法によるため、リファクタリングする気
もなくなる

•
•

問題:cbにちゃんと戻さないとダメ

•
14年2月28日金曜日

解決策:ちゃんとcbの関数を定義して、それを呼びましょう

解決策:ちゃんとやる
Promise(Q)
•
•
•

もうコールバックスタイルの記法嫌だ

•
•
•

利点:記法がわかりやすい、スコープがわかりやすい、続けて書ける

Promiseでしょ
hidouki(args)
.then(a)
.then(b)
.fail(e)

変わらない点:ちゃんとresolve/rejectしましょう
変わらない点:長い処理を書くと、thenの中身が凄く長くなる

•
14年2月28日金曜日

解決策:ちゃんと関数を定義して、それを呼びましょう
koa - yield/coによる方法
•
•
•
•
•
•

期待の新星
var result = yield hidouki(args)
よっしゃ!これは良い!
利点:スコープがわかりやすい、非同期でないように書ける
例外処理を自然に使える
なぜ「記法がわかりやすい」が利点でないか?

•

非同期処理してる部分とそうでない部分の区別が一見してつきに
くい

•
14年2月28日金曜日

解決策:ちゃんと責務を分けましょう
yield/coによる方法
• 変わらない点
• ちゃんとreturnしましょう
• return しないなら、ちゃんと例外を吐
いて、catchしよう

• 例外!全然使ったことなかった!
14年2月28日金曜日
教訓
•

最適解はあっても、ちゃんとしたコードが書け
ないと仕方がない

•

ダラッダラ同じ所に処理を書くのをやめて、
処理を分割しよう

•

ちゃんとエラー処理とか例外とかをハンドリ
ングしよう

•
14年2月28日金曜日

当たり前のことを要求する養成ギブス
まとめ
• 養成されました
• node.js ありがとう
• おわり にしようと思ったが

14年2月28日金曜日
• きれいに書けるに越したことはない
• ユーザーインタフェースとかの実装も
簡潔に書けて、なおかつ検証も可能な
計算モデルを構築したくなった

• 博士課程に行きます
14年2月28日金曜日

非同期プログラミング養成ギブスとしてのNode.js