多窗口访问时请求阻塞
发布于 12 年前 作者 supersheep 4201 次浏览 最后一次编辑是 8 年前

我按照范例,写了一个简单的httpServer来学习Node异步事件驱动的编程。代码如下

var http = require('http');
http.createServer(function(req,res){
	console.log("req",req.url);
	setTimeout(function(){
		console.log("res",req.url);
		res.writeHead(200,{"Content-Type":"text/plain"});
		res.write("hello");
		res.end();
	},3000);
}).listen(3000);

当我浏览localhost:3000并反复刷新时,terminal显示

req / req / req / res / res / res /

与预期的相同

而当我通过

for(var i = 0;i<5;i++){
    window.open("http://localhost:3000/");
}

在浏览器中打开多个窗口访问时,却变成了同步执行,最后一个窗口过了很久才返回。

这是什么原因呢?

4 回复

同步执行的效果是:第一个请求3秒后返回,第二个6秒后返回,第三个9秒……你说的最后一个窗口过了很久才返回是什么意思?其他请求呢?

是的,就是这样。修改后的真实代码是这样的:

var http = require('http');
http.createServer(function(req,res){
	var start = new Date();	
	if(req.url === "/favicon.ico"){
		return false;
	}
	console.log("req",req.url);
	setTimeout(function(){
		console.log("res",req.url,new Date() - start);
		res.writeHead(200,{"Content-Type":"text/plain"});
		res.write("hello");
		res.end();
	},3000);
}).listen(3000);

运行结果:

req /
res / 3005
req /
res / 3001
req /
res / 3002
req /
res / 3001
req /
res / 3001

直接在同一个窗口 Command + R 五次返回的就是

req /
req /
req /
req /
req /
res / 3003
res / 3000
res / 3001
res / 3003
res / 3001

系统环境是mac lion, node v0.6.11

@supersheep 既然有第二个说明没啥问题么,第一个是怎么“运行”出来的?

@jeffz chrome开五个窗口分别访问。刚才又拿safari测试了一下,一切正常。看来是chrome window.open时候的问题。

回到顶部