Node.js阻塞了吗?

时间:2013-03-05 16:55:36

标签: javascript node.js http blocking

我想我刚刚发现了一些与node.js或浏览器相关的东西。所以node.js应该是非阻塞的,但是一个简单的setTimeout会阻塞同一个客户端的整个网站。

这是服务器代码:

// Create HTTP Server
var http = require('http');

// Create page number holder
var page = 0;

http.createServer(function (req, res) {
    // Increment Page Number
    page++; 

    // Log page load
    console.log('LOAD PAGE', page); 

    // Set response header
    res.writeHead(200, {'Content-Type': 'text/plain'}); 

    // Wait 10 seconds and write Hello World message to client.
    setTimeout(function(){ res.end('Hello World\n'); }, 10000); 

}).listen(5000); // Listen on port 5000

// Log server start
console.log('Server running on port 5000.');

所以我在谈论的是当我尝试使用两个标签在Chrome(版本25.0.1364.152)中打开http://mysite.com:5000/时,第一个标签必须在node.js处理第二个标签之前完成

看起来像这样:

Client: Open Tab1 
> server console: LOAD PAGE 1

Client: Open Tab2
> server console: Nothing happens

Server: Wait 10 seconds
> server console: LOAD PAGE 2

我希望node.js能够立即运行这两个请求,否则这不是非阻塞的。我已经使用Firefox 19对此进行了测试,因此浏览器的行为似乎与此相同。

那发生了什么事?我错过了什么? :OOOO

更新

我只是在Safari(6.0.2)中运行测试并且它正常工作,因此这可能是Chrome和Firefox以及其他人的浏览器问题。

使用Node.js版本 v0.6.17 v0.8.21

进行测试

2 个答案:

答案 0 :(得分:12)

浏览器实现每个域名的并发连接限制。剪断:

  

浏览器通常会限制每个并发HTTP连接的数量   服务器为2(术语“每服务器”在这里广泛使用   简单。例如,它可以是多个物理机器   共享相同的公共IP。)。如果浏览器会话有两个HTTP   连接已经,任何进一步的连接请求将不得不等待   直到这两个HTTP连接中的一个完成。结果,   浏览器(或应用程序)似乎被锁定。虽然是“两个   连接限制“几年前有道理,这是非常有问题的   今天的Ajax启用了“web 2.0”应用程序。

来源:http://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue

节点未阻止,您的浏览器是。我建议使用apache基准测试(ab -c 10 -n 10)进行测试。

答案 1 :(得分:4)

是的,你错过了什么 您应该尝试使用除了完整的Web浏览器之外的其他内容来测试您的服务器。例如,尝试curl

Chrome做了许多其他事情,而不是做你告诉它做的事情。