NodeJS处理变量和并发连接



我正试图了解javascript和nodejs如何处理并发连接。

考虑以下最小示例:

var app = express();
var i = 0;
app.get("/", function(req, res) {
if (i < 10){
doSomething();
i++;
}else{
doDefault();
}
res.render("test");
}

如果您访问页面10次,下面的代码会执行doSomething((,但随后会对后续请求执行doDefault((。

doSomething((可能运行11次或更多次吗?因为对服务器的多个并发请求可以评估i<10是真的,但请求同时执行i++?

如果doSomething((在服务器上本地读取一个文件,该请求将在javascript中同时发生(带有回调或promise,因为这是节点做事的方式(,并且仍然继续执行。那么这样做安全吗:

if (i < 10){
i++;
doSomething();
}

现在我能保证函数doSomething((运行10次吗?即使数千个请求同时到达服务器?

这就是异步特性的用武之地。即使您向NodeJS发出了并行请求,但请求一个接一个地到达服务器。在Javascript中,默认情况下所有请求都是同步的,这意味着下一个请求只能在第一个请求之后处理。所以,若你们的API包含需要5分钟的阻塞代码,那个么你们的下一个请求将在5分钟后执行,即使在同一时间到达。

在您的示例中,doSomething()可以是同步的,也可以是异步的,它不会影响同步流,并且在接受下一个请求之前将i++

为了模拟,您可以尝试一个大的for循环,看看下一个API调用何时响应

var app = express();
var i = 0;
app.get("/", function(req, res) {
console.log('request received i = ', i);
for(let j = 0; j<9999999999999; j++) {}
i++;
res.render("test");
}

如果您想执行所有并行请求(即使是i>10(,只需在一些异步函数之后增加i即可。

app.get("/", function(req, res) {
console.log('request received i = ', i);
if (i<10) {
setTimeout(function(){
i++;
},5000);
} else {
doSomethingElse();
}
res.render("test");
}

在第一个请求的5秒内收到的任何数量的请求都将被执行,因为i值不会增加,并且将在异步工作5秒后增加。这是异步和事件循环的逻辑。

请查看此以了解更多的事件外循环。

最新更新