Open3

「イベントループとプロミスチェーンで学ぶJavaScriptの非同期処理」を読んだ学び

yuta4j1yuta4j1

JavaScriptはシングルスレッドと言われているが、JavaScriptで行われているすべての処理がシングルスレッドというわけではない。

Chromeでは複数のプロセスが生成される

  • Browser process
  • Renderer process
  • GPU process
  • Plugin process
  • Extensions process
  • Utility process

JavaScript の非同期処理でよく語られるシングルスレッドは現実のブラウザ環境 (Chrome) では「Renderer Process の Main thread」のことであり、fetch(url) のネットワーク接続やリクエストなどの処理を行っているのは「Browser process の Network thread」です。

そのため、ネットワークリクエスト処理は実質並列処理が行われている。

yuta4j1yuta4j1

(A) 非同期 API(環境の機能): setTimeout() や fetch() といったグローバルに利用できるメソッド
👉 起動後は環境によって並列的にバックグラウンドで処理される
(B) 非同期のシンタックスで書かれた関数 (ECMAScript の関数): 非同期 API の処理結果を使った後になにか処理する作業であり、非同期 API に渡す Callback や Promise chain、async/await で記述される
👉 イベントループの機構によって並行 (concurrent) にメインスレッドで処理される

つまり、自前実装したasync関数と、グローバル定義した関数は、同様に非同期的な振る舞いはするものの、別物と考えた方が良さそう。