面试题答案
一键面试过多微任务的影响
- 阻塞事件循环:微任务在当前宏任务执行结束后、下一个宏任务开始前执行。如果微任务队列中有大量微任务,会导致事件循环一直处理微任务,阻塞后续宏任务的执行,使得像 I/O 操作、用户交互等宏任务得不到及时处理,造成应用假死。
- 内存占用增加:微任务的创建和执行需要消耗内存,过多微任务会导致内存占用不断上升,可能引发内存泄漏等问题。
过多宏任务的影响
- 响应延迟:宏任务按顺序执行,如果有大量宏任务堆积,特别是一些耗时较长的宏任务(如复杂计算、I/O 操作),会使得事件循环长时间处于忙碌状态,新的宏任务和微任务得不到及时处理,导致用户交互响应延迟,影响用户体验。
- 资源竞争:在高并发场景下,多个宏任务可能同时竞争系统资源(如 CPU、网络带宽等),导致资源分配不均衡,进一步降低应用性能。
优化方法
- 针对微任务
- 控制微任务数量:避免在短时间内创建过多微任务,合理规划微任务的执行逻辑,将一些不必要的微任务合并或延迟执行。
- 使用队列控制:可以创建一个微任务队列,通过控制队列的长度和执行频率,避免微任务队列过度膨胀。例如,使用
async/await
结合setTimeout
来模拟队列执行,每次只执行一定数量的微任务,然后暂停一段时间,让事件循环有机会处理其他任务。
- 针对宏任务
- 任务拆分:对于耗时较长的宏任务,将其拆分成多个较小的任务,利用
setImmediate
或process.nextTick
等方式将任务分散到不同的事件循环周期执行,避免长时间占用事件循环。 - 优化 I/O 操作:尽量使用异步 I/O 操作,Node.js 原生提供了很多异步 I/O 的 API。同时,可以使用连接池等技术来管理 I/O 资源,提高 I/O 操作的效率,减少宏任务的执行时间。
- 合理使用 Web Workers(Node.js 14+):对于一些 CPU 密集型的宏任务,可以使用 Web Workers 将任务分配到不同的线程执行,避免阻塞主线程的事件循环,提高应用的并发处理能力。
- 任务拆分:对于耗时较长的宏任务,将其拆分成多个较小的任务,利用