请考虑以下代码:
const app = require('express')();
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
app.get('/', async (req, res) => {
await sleep(10000);
res.send('done');
});
app.listen(9999);
我认为我可以并行获取此端点,但显然Express一次只处理一个请求并按顺序提供其余请求。
为什么会这样,以及如何让一个端点能够并行处理多个请求?
答案 0 :(得分:0)
NodeJS(express的底层平台)是异步的但是是单线程的。有一个事件循环执行语句。如果您长时间阻止CPU时间,通过像在此代码中一样休眠,线程无法移动到其他语句(或服务新请求),即服务器挂起。这就是NodeJS不用于CPU阻塞请求的原因 - 必须将这些请求委托给另一个本身是多线程的系统。读取文件或使用网络进行发送/接收等IO请求不是问题,因为它们在后台执行而不会阻塞Node线程。对于这些,NodeJS只是在后台操作完成时注册要调用的回调,并且它可以继续执行其他语句(包括为其他请求提供服务)。
因此,您可以执行并行请求,但仅在处理这些请求时才会阻止CPU。