Javascript Node.js如何同时处理多个请求
我有一个Node.js应用程序,注意到当我同时向我的Node Api发出两个请求时,它们似乎在排队。也就是说,第二个请求的时间是第一个请求的时间加上第二个请求的时间(如果我只是自己触发了该请求) 所以我做了一个简单的测试:Javascript Node.js如何同时处理多个请求,javascript,node.js,Javascript,Node.js,我有一个Node.js应用程序,注意到当我同时向我的Node Api发出两个请求时,它们似乎在排队。也就是说,第二个请求的时间是第一个请求的时间加上第二个请求的时间(如果我只是自己触发了该请求) 所以我做了一个简单的测试: app.get('/api/testpromise', function(req, res) { sess = req.session; var controller = new Controller(req, res, sess); contr
app.get('/api/testpromise', function(req, res) {
sess = req.session;
var controller = new Controller(req, res, sess);
controller.testPromise()
.then(function(){
controller.testPromise()
.then(function(){
res.status(200);
res.json({});
});
})
})
testPromise()方法只执行一个循环:
Controller.prototype.testPromise = function(callback){
return new Promise(function(resolve, reject) {
var count = 0;
for (i = 0; i < 500000000; i++) {
count++;
}
if(count) {
resolve(count);
} else {
reject(count);
}
});
}
Controller.prototype.testPromise=函数(回调){
返回新承诺(功能(解决、拒绝){
var计数=0;
对于(i=0;i<500000000;i++){
计数++;
}
如果(计数){
解决(计数);
}否则{
拒绝(计数);
}
});
}
我从前端同时向“testpromise”发出两个请求,第一个请求大约需要5秒才能完成,第二个请求大约需要10秒。所以第二个似乎排在第一个后面
我想从我读到的关于Node的内容来看,我不会看到这样的行为?据说Node非常擅长处理大量并发请求并将它们传递出去。那么这实际上是如何工作的呢?您的测试使用的是阻塞同步代码。(i=0;i<500000000;i++)的for循环
将一直运行到它完成,因此中的第一个请求在它完成之前不会释放对事件循环的控制。这就像“忙碌的等待”
对你来说,一个更好的测试就是推迟
return new Promise(function(resolve, reject) {
setTimeout( function () {
resolve(5000)
}, 5000 ) // run the given function in 5000ms
});
这样,事件循环将在第一个请求等待时启动第二个请求。因此,如果您同时请求它们,它们将同时完成。好吧,这归结为:JS是单线程的,尽管您使用承诺,但您的循环会阻止此线程中其他代码的执行。看看这个:谢谢。实际上,我的API端点向MongoDb发出查询,它们正在排队……您可以发布实际代码以获得更多帮助,但对Mongo DB的调用应该像对节点的setTimeout()
调用一样,因为它将在Mongo获取数据时开始处理下一个请求。