为什么在Node.js上表示“连续”处理http请求?

我尝试了两个代码。 我只是同时从两个浏览器访问这些程序。

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

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

根据Sample1的输出,每个http请求都被串行处理。 所以如果有人在同一时间访问这个网站,他们需要等待每个以前的人。 起初,我认为这是因为Node.js连续处理所有东西。 但是根据Sample2的结果,我发现这是错误的理解。 从结果来看,Node.js可以同时处理一些包含setTimeout之类的非阻塞代码的函数。

所以我不明白为什么快递是这样实施的。 因此,我们需要使用像PM2一样的Cluster来同时处理一些http请求。

你能教我为什么expression这样的方式? 处理一些http请求的唯一解决scheme是使用Cluster?

样本1

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 

这可能是因为你的浏览器在这里描述

我只是使用Sample1和curl来testing它

 for i in $(seq 1 5); do curl localhost:3000/ & done 

发起5个请求,我看到他们同时运行 – 见GIF。
所以我不认为express是序列化您的请求,但您的客户端。

在这里输入图像说明

顺便说一句:在我的输出有一个额外的第三列显示Date.now()为每个日志行,因为我最初的猜测是因为缓冲日志输出。