Node.js阻塞?

我想我只是发现了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/时,第一个选项卡必须在第二个选项卡正在被节点处理之前完成.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 19testing过了,所以看起来浏览器的行为方式与此相同。

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

UPDATE

我只是在Safari(6.0.2)中运行testing,它可以正常工作,所以这可能是浏览器和Chrome浏览器的问题,也可能是其他问题。

testing了Node.js版本v0.6.17v0.8.21

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

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

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

节点不阻塞,你的浏览器是。 我推荐apache基准(ab -c 10 -n 10)进行testing。

是的,你错过了一些东西你应该尝试使用不同于成熟的Web浏览器的东西来testing你的服务器。 尝试curl例如。

Chrome做了很多其他的事情,而不是做你所说的事情。