NodeJS中不同路径的并行请求:长时间运行路径1阻塞其他路径

roh*_*pal 5 node.js

我正在尝试简单的NodeJS应用程序,以便我能够理解异步性质.

但我的问题是,一旦我/home从浏览器点击" "它等待响应,同时当" /"被击中时,它首先等待/home""的响应,然后响应" /"请求.

我担心的是,如果其中一个请求需要大量处理,那么我们不能再请求另一个请求了吗?它是否正确?

    app.get("/", function(request, response) {
        console.log("/ invoked");
        response.writeHead(200, {'Content-Type' : 'text/plain'});
        response.write('Logged in! Welcome!');
        response.end();
    });

    app.get("/home", function(request, response) {
        console.log("/home invoked");
        var obj = {
            "fname" : "Dead",
            "lname" : "Pool"
        }
        for (var i = 0; i < 999999999; i++) {
            for (var i = 0; i < 2; i++) {
                // BS
            };  
        };
        response.writeHead(200, {'Content-Type' : 'application/json'});
        response.write(JSON.stringify(obj));
        response.end();
    });
Run Code Online (Sandbox Code Playgroud)

Sta*_*sel 2

好问题,现在,尽管 Node.js 具有异步特性,但这段代码:

for (var i = 0; i < 999999999; i++) {
    for (var i = 0; i < 2; i++) {
        // BS
    };  
};
Run Code Online (Sandbox Code Playgroud)

不是异步实际上阻塞了节点主线程。因此,所有其他请求都必须等到这个大for循环结束。

为了并行进行一些繁重的计算,我建议使用setTimeoutsetInterval来实现您的目标:

var i=0;
var interval = setInterval(function() {
   if(i++>=999999999){
       clearInterval(interval);
   }
   //do stuff here
},5);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,我建议搜索“Node.js 事件循环”