NodeJS交响曲:事件循环

40 阅读2分钟

JS事件循环不是JS自身的机制,而是宿主提供的环境机制,JS可以运行在浏览器环境下(V8等JS引擎)或者 nodejs 环境下,通常我们讨论事件循环都是浏览器事件循环,但是在Node领域,事件循环是另一套规则

为了对比学习,我这里放一张 浏览器多线程架构的图,大家可以对比Nodejs环境下和浏览器环境下的事件循环。

image.png 值得一提的是,nodejs的事件循环在设计上在逐步的与浏览器的设计方式靠拢。

事件循环阶段

  1. timers 宿主环境发起的定时器回调
  2. pendingCallback 操作系统相关的回调函数,比如监听端口
  3. idle,prepare 系统内部使用,不做讨论
  4. poll I/O 阶段 当前check 和 timer队列为空的时候会等待一段时间
  5. check setImmediate回调
  6. closeCallback 关闭和清除相关的回调

微任务和宏任务

微任务在事件循环的每一个阶段前执行,当前事件循环阶段产生的微任务在下一个间隙执行,微任务产生的微任务在当前间隙执行,微任务和宏任务穿插执行

宏任务

  1. setlnterval - timers
  2. setimeout - timers
  3. I/O - poll
  4. setlmmediate - check

微任务

  1. Promise.then
  2. Promise.catch
  3. Promise.finally
  4. process.nextTick

process.nextTick

process.nextTick 是优先级最高的微任务,他的设计目的是让程序能够在IO之间做一些计算,比如在发送HTTP请求的同时发送做一些CPU密集型操作,每一个事件循环阶段之间都能够穿插nextTick

应用:

  • 处理竞态追踪问题,在当前请求完成后马上执行某些操作
  • 在模块加载完毕之后马上执行某些操作
  • 在错误处理之后马上执行某些操作
  • 阻塞IO操作,穿插计算过程等