如果一个请求需要很长时间才能执行,另一个选项卡将等待第一个请求完成。为什么?请解释一下。以及如何解决?这是我的代码:
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);
答案 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
代替经典循环可以帮助您的请求更快地工作(即更具可伸缩性)。