javascript - Node.js 如何同时处理多个请求

标签 javascript node.js

我有一个 Node.js 应用程序,并注意到当我同时向 Node Api 发出 2 个请求时,它们似乎已排队。即第二个请求的时间是第一个请求的时间加上第二个请求的时间(如果我只是自己触发该请求)。

所以我做了一个简单的测试:

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);
      }
    });

}

我从前端同时发出 2 个“testpromise”请求,第一个请求大约需要 5 秒才能完成,第二个请求大约需要 10 秒。所以第二个似乎排在第一个后面。

我认为根据我所读到的有关 Node 的内容,我不会看到这样的行为?据说 Node 非常擅长处理大量并发请求并将它们传递出去。那么这实际上是如何运作的呢?

最佳答案

您的测试正在使用阻塞同步代码。那个 for 循环 for (i = 0; i < 500000000; i++)将运行直到完成,因此第一个请求在完成之前不会释放事件循环的控制。就像“忙碌的等待”

对你来说更好的测试就是推迟

return new Promise(function(resolve, reject) {
    setTimeout( function () {
      resolve(5000) 
    }, 5000 ) // run the given function in 5000ms
});

这样,事件循环将在第一个请求等待时启动第二个请求。因此,如果您同时请求它们,两者将同时完成。

关于javascript - Node.js 如何同时处理多个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42971589/

相关文章:

javascript - 算法 : finding nearby value the fastest way

javascript - 带按钮的react-native renderRow : push rowData to button-function

Javascript 音频分层 eventListener HTML5 在多次迭代中失败

javascript - IE中的window.onload和body.onload

javascript - html canvas可以绘制上传的图像吗?

javascript - 将 JavaScript split()-slice()-join() 序列转换为 C++

angularjs - 将 Node 模块文件注入(inject)index.html

javascript - 从 JSON Schema 自动生成 JavaScript

javascript - 解构/破解 NodeJs

node.js - 如何使用 mongo、passport 和 Node js 更新用户的个人资料?