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を使用します。