Nodejs一个请求阻止另一个请求

时间:2012-08-30 12:40:11

标签: javascript node.js

如果一个请求需要很长时间才能执行,另一个选项卡将等待第一个请求完成。为什么?请解释一下。以及如何解决?这是我的代码:

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);

2 个答案:

答案 0 :(得分:3)

好读:

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

该记录的关键是:

  

...但是,除了您的代码

之外,所有内容都会并行运行

这意味着昂贵的I / O应该是异步的,但是你的代码可能会阻塞。但是,我们担心服务器上的阻塞通常是昂贵的I / O.

有关详细信息,请参阅此另一个问题:Node.js blocking the event loop?

答案 1 :(得分:1)

因为NodeJS是单线程的(就像浏览器JavaScript一样)。它一次只能处理一个代码。我们得到了并发的错觉,因为NodeJS具有非常奇特的代码块队列,这些代码块以异步方式触发。但是,一旦处理了块,就不能同时处理其他块。

使用NodeJS,您必须确保每个请求都已成功(无论是否成功),否则它可能会超出任何帮助(整个服务器,而不仅仅是请求)。

同样使用process.nextTick代替经典循环可以帮助您的请求更快地工作(即更具可伸缩性)。