node.jsはシングルスレッド
node.jsはシングルスレッドです。これは複数のリクエストがきた場合、順番に処理するということです。
これでは、一つのリクエストが重たい処理の場合、次のリクエストは待ち状態になってしまいます。
当たり前ですが、処理は常に並列に行わせたいわけです。これが無理になると、どうなるかを実践してみます。
requestHandler.jsのstartメソッドを10秒スリープさせて標準出力するようにします。
JavaScriptにはsleep関数はありませんので自作しています。詳細はJavaScriptでsleep関数を作成するを参照してください。

function start() {
    function sleep(milliSeconds) {
        var startTime = new Date().getTime();
        while (new Date().getTime() < startTime + milliSeconds);
    }

    sleep(10000);
    console.log("Request handler 'start' was called.");
}

function end() {
    console.log("Request handler 'end' was called.");
}

exports.start = start;
exports.end = end;
なお、server.js、router.jsはリクエストURLともっジュールをマッピングするで記述しているのと同じとします。

この状態で、http://127.0.0.1:8084/startにアクセスし、直ぐに別のタブブラウザで。http://127.0.0.1:8084/endにアクセスしてください。
10秒経ってからstartのコンソールが表示され、そのあとにendが実行されるように同期されてしまっています。
このことから、node.jsはシングルスレッドであることがわかります。

これを回避するにはchild_processを使用します。

Back to top

Information