JavaScriptはなぜシングルスレッドでも非同期処理ができるのか/Why Can JavaSctipt Invoke Asynchronous in Single Thread?
by
task4233
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
JavaScriptは なぜシングルスレッドでも 非同期処理ができるのか お昼のLT 2021/09/07 Takashi Mima(@task4233)
Slide 2
Slide 2 text
本LTの目標 ・JavaScript(ECMAScript)がシングルスレッドで非同期処理を 実現している方法をざっくり理解すること 本LTの想定対象者 ・JavaScriptの基本的な文法を理解している人 ・シングルスレッドの概念を理解している人 本LTの非想定対象者 ・内部実装にあまり興味がない人 ・JavaScriptを全く触れたことがない人 2
Slide 3
Slide 3 text
TL;DR(ECMAScript) JavaScriptはシングルスレッド ・Event LoopとCall Stackを用いて動いている 非同期処理を実現するための2種類のQueue ・Micro Task Queue ・Macro Task Queue 処理の優先度 ・Call Stack > Micro Task Queue > Macro Task Queue 3
Slide 4
Slide 4 text
自己紹介 ・Takashi Mima(@task4233) ・芝浦工業大学 M1 ・サーバサイドとセキュリティ ・散歩とGoが好き 4
Slide 5
Slide 5 text
JavaScript(以下JS)の変遷 1995 LiveScriptの誕生(後のJS) 1995 JScriptの登場(当時のJSと互換性ナシ) 1997 ECMAに標準化を依頼(いわゆるECMAScript) 2000~ 第3版派と第4版派の軋轢(低迷) 2005~ Ajax, prototype.js, jQuery等の登場(持ち直し) 2008 V8エンジンの登場(JITコンパイルによる高速化) 2009 Node.jsの登場(モジュール管理が可能に) …… 5
Slide 6
Slide 6 text
非同期処理に欠かせないPromiseオブジェクト State(状態)とValue(値)を持つ ・Stateはfulfilled✅ /rejected❌ /pending⏳ の3種類 ・Valueは結果 Promise(resolve func, reject func)で生成 ・fulfilled✅ => resolve funcを実行 ・rejected❌ => reject funcを実行 状態を持てるので、非同期処理に用いられる 6
Slide 7
Slide 7 text
JavaScriptはシングルスレッド シングルスレッド ・1度に1つのタスクしか実行できない ・メモリ空間での競合が起きない Event Loopに従ってタスクを処理する ・タスクを処理する無限ループ ・DOMの更新もタスクの1つ 処理はCall Stackで実行される ・処理のためのStack ・処理を実行するWEB APIにデータを流す ・Pushed -> Invoke -> Pop(& return Value)の順に 7
Slide 8
Slide 8 text
シングルスレッド? 8
Slide 9
Slide 9 text
あるタスクの実行中には 非同期処理を動かせないはず (シングルスレッドなので) 9
Slide 10
Slide 10 text
Q. どうやって非同期処理してるの? 🤔 10
Slide 11
Slide 11 text
A. Queueを別に持つことで 非同期っぽく逐次処理している 11
Slide 12
Slide 12 text
2種類のQueues Micro Task Queue ・優先度の高い方のQueue ・process.nextTick, Promise callbackなど Macro Task Queue ・優先度が低い方のQueue ・setTimeout, setInterval, setImmediateなど 処理の優先度 ・Call Stack > Micro Task Queue > Macro Task Queue 非同期処理に 用いられる 12
Slide 13
Slide 13 text
コードベースで考えてみる Call Stack Micro Task Queue Macro Task Queue Event Loop Log: 13
Slide 14
Slide 14 text
Log: コードベースで考えてみる Call Stack Micro Task Queue Macro Task Queue Event Loop 14
Slide 15
Slide 15 text
Log: コードベースで考えてみる console.log(‘Start’); Micro Task Queue Macro Task Queue Event Loop 15
Slide 16
Slide 16 text
コードベースで考えてみる Call Stack Micro Task Queue Macro Task Queue Event Loop Log: Start 16
Slide 17
Slide 17 text
コードベースで考えてみる Call Stack Micro Task Queue () => { console.log(‘timeout’) } Event Loop Log: Start 17
Slide 18
Slide 18 text
コードベースで考えてみる Call Stack Micro Task Queue () => { console.log(‘timeout’) } Event Loop Log: Start 18
Slide 19
Slide 19 text
コードベースで考えてみる Call Stack (res) => { console.log(res); } () => { console.log(‘timeout’) } Event Loop Log: Start 19
Slide 20
Slide 20 text
コードベースで考えてみる Call Stack (res) => { console.log(res); } () => { console.log(‘timeout’) } Event Loop Log: Start 20
Slide 21
Slide 21 text
コードベースで考えてみる console.log(‘End’); (res) => { console.log(res); } () => { console.log(‘timeout’) } Event Loop Log: Start 21
Slide 22
Slide 22 text
コードベースで考えてみる Call Stack (res) => { console.log(res); } () => { console.log(‘timeout’) } Event Loop Log: Start End 22
Slide 23
Slide 23 text
コードベースで考えてみる Call Stack (res) => { console.log(res); } () => { console.log(‘timeout’) } Event Loop Log: Start End 23
Slide 24
Slide 24 text
コードベースで考えてみる (res) => { console.log(res); } Micro Task Queue () => { console.log(‘timeout’) } Event Loop Log: Start End 24
Slide 25
Slide 25 text
コードベースで考えてみる Call Stack Micro Task Queue () => { console.log(‘timeout’) } Event Loop Log: Start End promise 25
Slide 26
Slide 26 text
コードベースで考えてみる () => { console.log(‘timeout’) } Micro Task Queue Macro Task Queue Event Loop Log: Start End promise 26
Slide 27
Slide 27 text
コードベースで考えてみる Call Stack Micro Task Queue Macro Task Queue Event Loop Log: Start End promise timeout 27
Slide 28
Slide 28 text
まとめ JavaScriptはシングルスレッド ・Event LoopとCall Stackを用いて動いている 非同期処理を実現するための2種類のQueue ・Micro Task Queue ・Macro Task Queue 処理の優先度 ・Call Stack > Micro Task Queue > Macro Task Queue ありがとうございました! 28
Slide 29
Slide 29 text
参考資料 ・✨♻ JavaScript Visualized: Event Loop - DEV Community ・⭐🎀 JavaScript Visualized: Promises & Async/Await - DEV Community ・Understanding the node.js event loop ・voyagegroup/treasure-javascript-2020: Treasure Frontend 講義資料とか ・ そうだったのか! よくわかる process.nextTick() node.jsのイベントループを 理解する 29