2

1 つのリクエストの実行に時間がかかる場合、別のタブは最初のリクエストが完了するまで待機します。なんで?説明してください。そして、それを解決する方法は?ここに私のコード:

var http = require("http");
var url = require("url");

http.createServer(function(request, response) {

    if (url.parse(request.url).pathname == '/long')
    {
        function longlong()
        {
            var counter = 0;
            var startTime = new Date().getTime();
            while (new Date().getTime() < startTime + 10000)
            {
                counter++;
            }
            return counter;
        }

        response.writeHead(200, {"Content-Type": "text/plain"});
        response.write(longlong() + '');
        response.end();
    }
    else
    {
      response.writeHead(200, {"Content-Type": "text/plain"});
      response.write(0 + '');
      response.end();
    }

}).listen(8888);
4

2 に答える 2

2

よく読んでください:

http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

その記事からの重要な行は次のとおりです。

…ただし、コードを除いてすべてが並行して実行されます

つまり、高価なI / Oは非同期である必要がありますが、コードがブロックされる可能性があります。ただし、サーバーでのブロックが心配なのは、通常、高価なI/Oです。

例の詳細については、この他の質問を参照してください:Node.jsがイベントループをブロックしていますか?

于 2012-08-30T13:09:16.683 に答える
1

NodeJSはシングルスレッドであるため(ブラウザのJavaScriptと同じように)。一度に処理できるコードは1つだけです。NodeJSには非同期の方法で起動されるコードブロックの非常に凝ったキューがあるため、並行性の錯覚が生じます。ただし、ブロックが処理されると、他のブロックを同時に処理することはできません。

NodeJSを使用する場合は、すべてのリクエストが(成功するかどうかにかかわらず)終了することを確認する必要があります。そうしないと、ヘルプを超えてクラッシュする可能性があります(リクエストだけでなくサーバー全体)。

またprocess.nextTick、従来のループの代わりに使用すると、要求がより高速に機能する(つまり、よりスケーラブルになる)のに役立つ場合があります。

于 2012-08-30T12:50:34.493 に答える