2012-08-30 73 views
3

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

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

回答

3

良好读取:

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

从关键行写上去是:

......然而,一切都在并行运行,除了你的代码

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

详情请参见本等问题用一个例子:Node.js blocking the event loop?

+0

'...但是,除了你的代码,所有的东西都能并行运行,告诉我的答案 – swapnilsarwe

+0

好的,谢谢。我知道了 – Mikhail

1

因为NodeJS是单线程的(就像浏览器的JavaScript)。它一次只能处理一个代码。我们得到了并发的幻觉,因为NodeJS有非常花哨的以异步方式触发的代码块队列。但是,一旦该块被处理,就不能同时处理其他块。使用NodeJS,您必须确保每个请求都结束(无论是否成功),否则它可能会崩溃超出任何帮助(整个服务器,而不仅仅是请求)。

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

+0

我明白这一点,但我怎么能阻止另一(简单)请求的拦截?你能给我一个例子吗,请 – Mikhail

+2

你不能!它会**总是**阻止其他请求。你想要达到什么目的?您的请求处理程序没有多大意义。 – freakish

+0

这只是一个例子。在现实世界中,它收集来自多个异步数据库请求的数据并对其进行处理 - 重新组合,计算平均值,准备显示,大约需要10秒钟,但另一个请求正在等待此请求。我尝试了解如何使用它。 – Mikhail