ikemonn's blog

技術ネタをちょこちょこと

【Node.js】イベントループの仕組み

概要

Nodeのイベントループは文字通りwhieで行われている ループ処理はI/Oイベントの処理(リクエスト)の実行時やI/Oイベントの発生を待つオブジェクト(ハンドル)の登録時に維持される

例えば下記のコードはハンドルやリクエストが何も登録されていないので、イベントループは維持されずにNodeのプロセスはすぐに終わる

var http = require('http');
var server = http.createServer(function () {});

しかし、server.listen()を加えると、ハンドルの登録が行われてイベントループは維持される。 登録されたハンドルはAPIで削除することもできる。

var http = require('http');
var server = http.createServer(function () {});
server.listen(1337, function() {    // ハンドルの登録
    setTimeout(function(){
        console.log("1秒たったので終了します");
        server.close(); // 1秒経つとプロセスが終了する
    }, 1000);
});

Nodeのイベントループで特に重要なのは以下の5ステップ

  1. setTimeout()のコールバック実行
  2. process.nextTick()のコールバック実行(メインモジュールの実行)

    • ユーザから見るとプログラム上のイベントループの起点はここ
  3. I/Oイベントの発生

    • 一旦イベントループが停止してOSがI/Oイベントを待ち受ける
  4. I/Oイベントのコールバック実行

    • このステップが主なJSの実行ステップ
  5. process.nextTick()コールバックの実行

参考

サーバサイドJavaScript Node.js入門 (アスキー書籍)

サーバサイドJavaScript Node.js入門 (アスキー書籍)