JavaScriptのシングルスレッドは至高: マルチスレッドなんて必要ないさ
JavaScriptはシングルスレッドで、非ブロッキング、非同期プログラミング言語だよ。つまり、実行スレッドは1つだけだけど、プログラム全体の実行をブロックせずに非同期操作を効率的に扱えるんだ。これを実現する仕組みをイベントループって言うんだ。
イベントループ:
イベントループはJavaScriptの並行処理モデルの重要な部分で、実行キュー(メッセージキューっても言われる)をずっとチェックして、新しいメッセージがあったら順番に処理していくんだ。キューにはメッセージやイベントとそれに関連するコールバック関数が入ってる。
コールバックキュー:
非同期操作が完了すると(ネットワークリクエストやファイル読み込み、タイマーなど)、関連づけられたコールバック関数を含んだメッセージがコールバックキューに追加されるようになってる。
実行スタック:
実行スタックは、現在実行中の関数を追跡するスタック型のデータ構造だよ。関数が呼び出されるとスタックにプッシュされて、終了するとスタックからポップされるってわけ。
非ブロッキングの性質:
JavaScriptは非ブロッキングだから、非同期操作が進行中の間でも、プログラムはその完了を待たずに他のタスクの実行を続けられるんだ。
JavaScriptはイベント駆動のプログラミングに大きく依存していて、ユーザーの動作や非同期操作の完了などのイベントが発生すると、それに関連したコールバック関数が実行されるって仕組み。
イベントループがどう動くのかを示す簡単な例を見てみよう:
console.log("スタート");
// 非同期操作(setTimeoutでシミュレーション)
setTimeout(function () {
console.log("非同期操作完了");
}, 2000);
console.log("エンド");
この例では、「スタート」と「エンド」というメッセージがすぐにログに出力されて、setTimeout内の非同期操作が予定されるんだ。イベントループは動き続けて、約2秒後にsetTimeout内のコールバック関数がメッセージキューに追加されて実行され、「非同期操作完了」とログに出力されることになる。
まとめ
(イラストはhttps://dev.to/lydiahallie/javascript-visualized-event-loop-3difより)
この仕組みによって、JavaScriptはメインスレッドをブロックせずに非同期タスクを効率的に扱えるようになっていて、ユーザーの操作やネットワークリクエスト、I/O操作などのタスクに適してるんだ。
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/fahadachaudhry/javascripts-single-threaded-bliss-because-who-needs-multithreading-anyway-1d53