私はnodejsで新しく、いくつかの実験をしています。私はそれらから得たもの(そして私が間違っていることを願っています!)は、nodejsが同じリソースに対する複数の同時リクエストを順番に処理することができなかったことです。同じリソースのnodejsマルチスレッド
次のコード(私は、次の例ではExpressのフレームワークを使用して)考えてみましょう:コードの一部は、上記の2つのエンドポイントを公開し
var express = require('express');
var app = express();
app.get('/otherURL', function (req, res) {
res.send('otherURL!');
});
app.get('/slowfasturl', function (req, res)
{
var test = Math.round(Math.random());
if(test == "0")
{
var i;
setTimeout
(
function()
{
res.send('slow!');
}, 10000
);
}
else
{
res.send('fast!');
}
});
app.listen(3000, function() {
console.log('app listening on port 3000!');
});
:
- http://127.0.0.1:3000/otherurl、ただで返信することを "otherURL!"単純なテキスト
- http://127.0.0.1:3000/slowfasturl、それがランダムに以下の2つの動作のうちいずれかに従っています
シナリオ1: "!速い" のすぐと返事を単純なテキスト
または
シナリオ2: "!遅い" と10秒後に返信シンプルなテキスト
私のテスト: 同時に、slowfasturlのURLで複数のクロムの呼び出しウィンドウを開きました。最初のリクエストが「シナリオ2」に該当することがわかりました。 (シナリオ1)に落ちている(そして「ゆっくり!」を返す)か「シナリオ2」(そして「速く!」)という事実を明白に他の要求はクロームの他のウィンドウと続いて発砲した。要求は、最初の1つ(「シナリオ2」に該当するもの)が完了しない限り、少なくともブロックされます。
どのようにこの現象について説明しますか?同じリソースに対して行われた要求はすべて順番に処理されますか?
「シナリオ2」のリクエストが応答を待っている間に、2番目のリクエストが別のリソース(たとえば、上記で説明したotherurl URL)に行われた場合、別の動作が発生します。この場合、第2の要求は最初の1
が
ダヴィデ私が覚えている限りでは
@AsTeR様、もう一度チェックしました。たとえば、複数のブラウザを使用している場合(たとえば、Chromeで1つのリクエストとIEで1つのリクエスト)、リクエストは並行して管理されているようです。しかし、setTimeoutを(同期的に実行される)Date.now()をチェックするループに置き換えると、要求は順番に管理されます!次のことができますか?処理がコールバック関数に委譲されるまで、nodejsリスナーによって要求が順番に管理されます(これはsetTimeoutの場合です)。 –
setTimeoutは、将来処理する予定を追加していますループ、あなたのスレッドはそのループでブロックされます。 JavaScriptで何かをブロックしてはいけません。気づいているようにフリーズします。私はあなたがここに新しい人であることに気付きました。「歓迎!」私の答えが正しければ、隣の緑色のチックをチェックすることができます。 – AsTeR