为什么在Node.js上表达http请求"串行"?

时间:2016-06-11 03:57:36

标签: node.js express

我在下面尝试了两个代码。我刚刚从两个浏览器同时访问这些程序。

在Sample1中,res.send在所有处理之后执行,这是一般实现。 我的意思是,这些" setTimeout"可以是数据库访问或类似的东西。

在Sample2中,首先执行res.send,然后执行其余的处理。

根据Sample1的输出,每个http请求都是串行处理的。因此,如果有些人同时访问该网站,他们需要等待所有以前的人。 起初,我认为原因是因为Node.js串行处理所有内容。但是我发现根据Sample2的结果,它的理解是错误的。 从结果中,Node.js可以同时处理一些函数,其中包括非阻塞代码,如setTimeout。

所以我无法理解为什么快递以这种方式实施。 因此,我们需要像PM2一样使用Cluster来同时处理一些http请求。

你能教我为什么表达这样的方式吗?而同时处理某些http请求的唯一解决方案就是使用Cluster?

的Sample1

var express = require('express');
var app = express();

app.get('/', function (req, res) {
    var id = Math.floor(1000*Math.random())
    console.log('0 - ' + id)
    setTimeout(()=>{
        console.log('1 - ' + id)
        setTimeout(()=>{
            console.log('2 - ' + id)
            setTimeout(()=>{
                console.log('3 - ' + id)
                res.send('Hello World!');
            }, 1000)
        }, 1000)
    }, 1000)
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

Sample1的输出

0 - 957
1 - 957
2 - 957
3 - 957
0 - 447
1 - 447
2 - 447
3 - 447

样品2

var express = require('express');
var app = express();

app.get('/', function (req, res) {
    res.send('Hello World!');
    var id = Math.floor(1000*Math.random())
    console.log('0 - ' + id)
    setTimeout(()=>{
        console.log('1 - ' + id)
        setTimeout(()=>{
            console.log('2 - ' + id)
            setTimeout(()=>{
                console.log('3 - ' + id)
            }, 1000)
        }, 1000)
    }, 1000)
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

Sample2的输出

0 - 902
0 - 742
1 - 902
1 - 742
2 - 902
2 - 742
3 - 902
3 - 742

1 个答案:

答案 0 :(得分:3)

可能是因为您所使用的浏览器为here

我刚使用

对Sample1和curl进行了测试
for i in $(seq 1 5); do curl localhost:3000/ & done  

发出5个请求,我看到它们同时运行 - 请参阅GIF 因此,我不认为express正在序列化您的请求,而不是您的客户。

enter image description here

BTW:在我的输出中,还有一个额外的第3列显示每个日志行Date.now(),因为我的初始猜测是因为缓冲了日志输出。