事件驱动理解草稿
单线程事件驱动 + 非阻塞I/O模型
理解上和浏览器类似,对于网络请求,文件读写,是由其他线程处理,处理完后将回调放入事件循环队列。
类似浏览器的同步 xhr 请求,node 也可以同步读写文件,那么将始终占用该线程。
Q1: node 请求里的回调如果有耗时代码,是否会卡在其他请求的处理? A1: 是的。如果每个请求里都有一段 50ms 的耗时代码处理,那么该服务的 qps 不高于 20
Q2: 某个请求里 await 请求是否会卡住其他请求的处理? A2: 不会。每个请求的回调执行是一个任务,可以理解为把多个任务放入了事件循环中执行。这里我们用 setTimeout 在浏览器上模拟
const task = async (name) => {
console.time(name)
await new Promise((resolve) => {
setTimeout(resolve, 5 * 1000)
})
console.timeEnd(name)
}
setTimeout(() => {
task("a")
}, 1000)
setTimeout(() => {
task("b")
}, 2000)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
Q3:
# Ref
https://juejin.cn/post/6844904054120792071
编辑 (opens new window)
上次更新: 2023/08/23, 09:32:05