多窗口访问时请求阻塞
发布于 3年前 作者 supersheep 1366 次浏览

我按照范例,写了一个简单的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时候的问题。

回到顶部