Javascript Node.js正在阻塞吗?

Javascript Node.js正在阻塞吗?,javascript,node.js,http,blocking,Javascript,Node.js,Http,Blocking,我想我刚刚在node.js或浏览器中发现了一些非常奇怪的东西。因此node.js应该是非阻塞的,但是一个简单的setTimeout会为同一个客户端阻塞整个网站。 这是服务器代码: 所以我要说的是,当我尝试在Chrome(版本25.0.1364.152)中打开两个选项卡时,第一个选项卡必须在node.js处理第二个选项卡之前完成 看起来是这样的: 我希望node.js立即运行这两个请求,否则这不是非阻塞。我已经用Firefox19测试过了,所以浏览器在这方面的表现似乎是一样的 发生了什么事?我是不

我想我刚刚在node.js或浏览器中发现了一些非常奇怪的东西。因此node.js应该是非阻塞的,但是一个简单的setTimeout会为同一个客户端阻塞整个网站。

这是服务器代码: 所以我要说的是,当我尝试在Chrome(版本25.0.1364.152)中打开两个选项卡时,第一个选项卡必须在node.js处理第二个选项卡之前完成

看起来是这样的: 我希望node.js立即运行这两个请求,否则这不是非阻塞。我已经用Firefox19测试过了,所以浏览器在这方面的表现似乎是一样的

发生了什么事?我是不是遗漏了什么噢

使现代化 我只是在Safari(6.0.2)中运行测试,它工作正常,所以这可能是Chrome和Firefox以及其他浏览器的问题


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

测试是的,您缺少了一些东西 您应该尝试使用成熟的web浏览器以外的其他工具测试服务器。例如,尝试
curl


Chrome除了做你让它做的事情之外,还有很多其他的事情。

是的,你错过了一些东西 您应该尝试使用成熟的web浏览器以外的其他工具测试服务器。例如,尝试
curl


Chrome除了做你让它做的事情之外,还做了很多其他的事情。

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

浏览器通常限制每个浏览器的并发HTTP连接数 服务器为2台(为了方便起见,这里广泛使用术语“每台服务器”) 例如,它可以是多台物理机器 共享相同的公共IP。)。如果浏览器会话有两个HTTP 连接已经存在,任何进一步的连接请求都必须等待 直到这两个HTTP连接中的一个连接完成 浏览器(或应用程序)似乎已被锁定 “连接限制”在几年前就有了意义,但在 今天支持Ajax的“Web2.0”应用程序

资料来源:


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

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

浏览器通常限制每个浏览器的并发HTTP连接数 服务器为2台(为了方便起见,这里广泛使用术语“每台服务器”) 例如,它可以是多台物理机器 共享相同的公共IP。)。如果浏览器会话有两个HTTP 连接已经存在,任何进一步的连接请求都必须等待 直到这两个HTTP连接中的一个连接完成 浏览器(或应用程序)似乎已被锁定 “连接限制”在几年前就有了意义,但在 今天支持Ajax的“Web2.0”应用程序

资料来源:


节点没有阻塞,您的浏览器没有。我建议使用apache benchmark(ab-c 10-n 10)进行测试。

我冒昧地猜测,并不是整个服务器都挂起,但您的浏览器希望重用keepalive连接……如果您(a)尝试来自不同IP的第二个请求(b)尝试来自不同浏览器的请求,(c)会发生什么如果您将
{'Content-Type':'text/plain','Connection':'close'}
作为头文件?我猜,并不是整个服务器都挂起,而是您的浏览器想要重用keepalive连接…如果您(a)尝试来自不同IP的第二个请求(b)尝试来自不同浏览器的请求,以及(c)会发生什么如果您给出
{'Content-Type':'text/plain','Connection':'close'}
as header?我刚刚在Safari上试用过,效果很好,所以这可能是一个与浏览器相关的问题。但由于Chrome和Firefox是最流行的浏览器,这真的很奇怪:\相信我。Node.js没有阻塞。Chrome只允许对同一主机的两个并发请求。我在这里假设,因为它正在下载页面和/favicon.ico我相信你,这是有道理的。我刚刚用Safari试过这个,它在那里工作,所以这可能是一个与浏览器相关的问题。但是由于Chrome和Firefox是最流行的浏览器,这真的很奇怪:\相信我。Node.js没有阻塞。Chrome只允许wo对同一主机的并发请求。我在这里假设,因为它正在下载页面和/favicon.ico,它只是等待其中一个完成,然后再开始第二个选项卡。我相信你,这是有意义的。
// 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.');
Client: Open Tab1 
> server console: LOAD PAGE 1

Client: Open Tab2
> server console: Nothing happens

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