2

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

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 blocking the event loop?

于 2012-08-30T13:09:16.683 回答
1

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

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

也使用process.nextTick而不是经典循环可以帮助您的请求更快地工作(即更具可扩展性)。

于 2012-08-30T12:50:34.493 回答