Concurrent Programming in
JavaScript
SEINO Yoshinori
Sapporo.js
自己紹介
• 情野 吉紀
• 職業 デバッガー
• プログラミング好き
• 趣味プログラミングしない
• JavaScriptほとんど書かない
おしながき
• 導入
• カタログ
• 未来
• 導入
• 並行プログラミングカタログ
• 未来
メリット
• なんでしょう?
• JavaScript 1スレッドしかないよね?
JSスレッドモデル
• シングルスレッドのように振る舞う
• デッドロック、競合状態と無縁
• WebWorkerについては後でね
• サイ本6版 p.352
• 13.3.3 クライアントサイドJavaScriptスレッドモデル
メリット
• 複数の処理を並行に実行できると
• scriptロード
• ユーザ入力応答
• 通信
• DOM操作
• などを、待機時間なしに実行できる
デメリット
• なんでしょう?
デメリット
• キュータスク処理時間は50msec以下
• 続・ハイパフォーマンスWebサイト
• メンテナンス性の低下
• デバッグの難化
• 実行順序が非決定的
どうにかならないの?
• 導入
• 並行プログラミングカタログ
• 未来
カタログ
• コールバックネスト
• setTimeoutイディオム
• Web Workers
• node.jsスタイルAPI
• Promise/A(+)
• Flow.js ( NOT Flow-js )
コールバックネスト
• ユースケース
• 非同期API
setTimeoutイディオム
• ユースケース
• ユーザ応答性を高めるために処理を
分割したい
• 続・ハイパフォーマンスWebプログラミング
• http://please-sleep.cou929.nu/using-javascript-timer-for-ui-
performance.html
Web Workers
• ユースケース
• ユーザ応答性を高めるために処理を
分割したい
• とりわけ重い処理(100ms over)を並行
処理したい
• Web Workers
node.jsスタイルAPI
• ユースケース
• node.jsアプリケーションを作る際に
書く
• http://dev.classmethod.jp/server-
side/asyn/
Promise/A(+)
• ユースケース
• 非同期API間でデータを引き継ぐ場合
• 例外処理が必要な場合
Flow.js
• ユースケース
• 処理フローがグラフ構造のように複
雑になる場合
未来
• Web Workers
• Task.js - http://taskjs.org/
• generators + promises = tasks
• Fiber - https://npmjs.org/package/fibers
• Actor -
参考文献
• JavaScript 第6版
次回予告
• Io : Prototype Programming Language
• JavaScript: Power of Simplicity Part2
Functional Programming

Concurrent Programming in JavaScript

Editor's Notes

  • #4 動機 - JavaScriptプログラムを書いてて並行プログラミングをしなければ行けなくなる理由は? 並行プログラミングカタログ - 並行プログラミング技法は何十年も前から研究されているが、一方で現在のJavaScriptではどんなプログラミング技法が使えるの? 未来 - 現在主流となっている並行プログラミング技法、そしてEcmaScript6の仕様からJavaScriptの未来の並行プログラミング技法をイメージします。
  • #5 動機 - JavaScriptプログラムを書いてて並行プログラミングをしなければ行けなくなる理由は?
  • #7 サーバーサイドは@tricknotesに聞いてください。 node.js はプロセスをフォークしてプロセス間通信するっぽい。OSネイティブなプロセス間通信プログラミング。 RhinoとかはたぶんJavaThreadじゃね?(投げやり)
  • #9 ATMの例 札幌駅地下街のアピアにはATMたくさんあります。 複数の金融機関それぞれについて複数台あり、通路が待っている人であふれないようになっています。 仮に、1台しかATMがなかったとします。 人がたくさん並びます。対策をとらないとすぐに人であふれてしまいます。 どんな対策をとりますか? 答えは、一人一人の持ち時間を設定することです。
  • #10 メンテナンス性の低下ってのは、著しく読みづらくなる、属人性の高いコードが生まれやすい
  • #12 動機 - JavaScriptプログラムを書いてて並行プログラミングをしなければ行けなくなる理由は?
  • #15 Web
  • #20 Web Workers 共有ワーカー 名古屋にお住まいの @bleis おにいちゃんが発表した async/await 不要論 http://bleis-tift.hatenablog.com/entry/asyncawaitdis F# computation式 asyncワークフロー