我在下面尝试了两个代码。我刚刚从两个浏览器同时访问这些程序。
在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
答案 0 :(得分:3)
可能是因为您所使用的浏览器为here
我刚使用
对Sample1和curl
进行了测试
for i in $(seq 1 5); do curl localhost:3000/ & done
发出5个请求,我看到它们同时运行 - 请参阅GIF
因此,我不认为express
正在序列化您的请求,而不是您的客户。
BTW:在我的输出中,还有一个额外的第3列显示每个日志行Date.now()
,因为我的初始猜测是因为缓冲了日志输出。