【いべんとるーぷ】

イベントループ とは?

最終更新:
💡 待っている間にも、実行できる処理を進める

イベントや処理の完了に応じて、実行する処理を選び、順に進める仕組み。ここではブラウザとNode.jsのJavaScriptを扱い、処理の実行と非同期の待ち時間を区別する。

📌 このページのポイント
ブラウザのイベントループ タスク群 タイマー・入力など 選んだ処理を実行 JavaScript チェックポイント マイクロタスクを 空になるまで処理 次へ 画面更新には描画の機会がある 同じスクリプトで登録した例 同期 S Promise A Timer B
ブラウザのタスク実行とマイクロタスクのチェックポイントを簡略化。タスク群は複数あり、毎回描画する保証はない。下段は解決済みPromiseと0指定タイマーを同じ通常のスクリプトで登録し、同期のSを出力する例。Node.jsの段階はこの図とは異なる。
ひよこ ひよこ
イベントループは何をしているの?
ペンギン先生 ペンギン先生
イベントや処理の完了に応じて、実行できる処理を選んで進めるよ。JavaScriptの処理を一つずつ実行しながら、通信などの待ち時間には別の処理を進められる。待機する仕組みと、完了後の処理を動かすことを分けて考えよう。
ひよこ ひよこ
重い計算も自動で並列にしてくれる?
ペンギン先生 ペンギン先生
同じイベントループ上の長い同期処理は、ほかの処理を待たせるよ。非同期I/Oでも裏側の仕組みは処理によって違う。例えばNode.jsはOSの機能に加え、ファイルI/Oなどにワーカープールを使う。JavaScriptで重い計算を書くこととは別なんだ。
ひよこ ひよこ
setTimeoutで0を指定したら、すぐ実行する?
ペンギン先生 ペンギン先生
現在の処理へ割り込んで実行する指定ではないよ。時間条件を満たしてから実行の機会を待つので、ほかの処理で遅れることもある。指定した時間ぴったりに動く保証はないんだ。
ひよこ ひよこ
Promiseの処理は、タイマーより先なの?
ペンギン先生 ペンギン先生
ブラウザではPromise.thenやqueueMicrotaskの処理を、チェックポイントでキューが空になるまで実行するよ。同じ通常のスクリプトで、解決済みPromiseのA、0指定のタイマーのB、最後に同期のSを登録・出力すると、S→A→Bになる。すべての非同期処理にこの順序を一般化しないようにしよう。
ひよこ ひよこ
ブラウザとNode.jsは同じ仕組み?
ペンギン先生 ペンギン先生
基本の考え方は似ているけれど、細部は異なるよ。ブラウザには画面更新の機会があり、毎回必ず描画するわけではない。Node.jsにはI/Oなどを扱う段階やprocess.nextTickの仕組みがある。実行順を調べるときは環境と登録した場所を確認しよう。
もっと詳しく知りたい人へ

マイクロタスクを追加し続けたらどうなる?

ブラウザのチェックポイントでは、途中で追加されたものも含め、マイクロタスクのキューが空になるまで処理するよ。その処理が新しいマイクロタスクを追加し続けると、次のタスクや画面更新へ進む機会を遅らせる。Promiseを使ったことだけで重い処理が別スレッドへ移るわけではないんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「イベントループ」って出てきたら「イベントや処理の完了に応じ、実行できる処理を順に進める仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Event Loop」 = イベントを扱う繰り返し
💬 イベントや処理の完了に応じて、次に実行する処理を選び続ける仕組みを表す名前だよ。ブラウザとNode.jsでは具体的な処理の選び方が異なるんだ。

参考資料

← 用語集にもどる