Node.jsのイベントループについて質問です.
これまで, nodeのシングルスレッドで動作する機構の認識は複数のリクエストがnodeのサーバーが
受け付けた場合, 一つひとつのリクエストを順にさばいていくという認識でおりました.
node.js
1const http = require('http'); // httpモジュールをrequire 2const PORT = 3000; // 待機するポートは3000 3let count = 0; // アクセスされた回数 4 5const server = http.createServer(); // Serverオブジェクトを作成 6server.on('request', doReq); // requestイベントにdoReqを登録 7server.listen(PORT); // 待機 8 9// requestイベント発火時時に実行する関数 10function doReq(req, res) { 11 if (req.url == '/dummy') { 12 setTimeout(function() { 13 count++; 14 res.end(`count:${count}`); // アクセスされた回数をクライアントに返す 15 }, 60000) 16 } else if (req.url == "/") { 17 count++; 18 res.end(`count:${count}`); // アクセスされた回数をクライアントに返す 19 } 20} 21
その認識とは, 上記のようなnodeのプログラムを考えた場合,
1 番目のリクエスト A アクセスしたURL => http://localhost:3000/dummy/
2 番面のリクエスト B アクセスしたURL => http://localhost:3000
とします.
まずAがリクエストをした場合
node.jsのTimerが60秒後に無名関数をコールスタックに配置するまで
Aのリクエストは待機中だと思います.A
その後即座に
Bがリクエストをした場合
Bの処理はsetTimeoutはなく直ぐにレスポンスを返す処理になっています.
ここからはこれまでのわたしの認識でしたが,
AがリクエストしたあとsetTimeoutで60秒間またされている間
Bのリクエストもそれに伴って60秒間(イベントループでは厳密には4msごとに区切っているそうなので,正確ではないらしいですが)
待たされるという認識でした.
しかし 上記プログラムを実際に起動し
ブラウザ側でAリクエスト (60秒間またされる)
ターミナルでcurl でBリクエストをしたところ
ターミナルのBリクエストは60秒またされずに即座にレスポンスが帰ってきました.
シングルスレッドと聴くと,前のAリクエストが終わらない限り次のリクエストまで処理が移らないと
思っていたのです.
上記のプログラムはなぜ
AとBともに一般的なマルチスレッドやマルチプロセスなサーバーと同じように
最初のリクエストで時間がかかっていても,次のリクエストをさばけているのでしょうか?
識者の方ご教授をお願い致します.
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。