我正在设法将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判断为true,但是请求同时执行i ++?
如果doSomething()在服务器上本地读取文件会发生什么,该请求将在javascript中同时发生(带有回调或Promise,因为这是节点的处理方式),并且仍然继续执行。这样做会安全吗?
if (i < 10){
i++;
doSomething();
}
我现在是否可以保证函数doSomething()可以准确运行10次,即使同时有数千个请求到达服务器?
答案 0 :(得分:0)
这是异步性质的体现。即使您向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秒后将递增。这是异步和事件循环的逻辑。