node 单线程是怎么应对高并发的场景的?

2022-01-20 17:15:25 +08:00
 leebs

node 单线程处理事件请求,一个请求卡住了,后续其他请求都会卡住,用 node 做业务处理,并发高的情况下,岂不是后面的请求可能会一直排队? node 不是单线程分发事件,多线程处理事件嘛?

12046 次点击
所在节点    Node.js
43 条回复
KouShuiYu
2022-03-03 16:27:45 +08:00
@coseylee 只有不是 CPU 密集型计算(比如从 1 循环加到一亿 )都不会卡着,你可以试试比如说请求、读文件等等

const http = require('http');
const {
URL
} = require('url');
const {
setTimeout
} = require('timers/promises');

const hostname = '127.0.0.1';
const port = 3001;

function fetch(url) {
return new Promise((resolve) => {
http.get(url, (res) => resolve(res));
})
}


const server = http.createServer(async (req, res) => {
const t = new URL(`http://${hostname}:${port}${req.url}`).searchParams.get('t');
// 模拟耗时操作
await fetch(`http://127.0.0.1:3000/?t=${t}`);

res.end(`Hello World:${t}`);
});

server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}`);
});
coseylee
2022-03-04 09:18:21 +08:00
@KouShuiYu 是的,这些都是异步操作,会在线程池处理。针对题主所问,如果长时间阻塞主线程,的确无法再接受请求进来。
willx12123
2022-06-19 10:24:05 +08:00
如果你没有计算耗时的操作,Node 会在相当短的时间把控制权交给下一个请求,直到你的数据库任务、或是网络请求完成时才会继续阻塞程序

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/829521

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX