ChenPt / dailyNote

dailyNode for myself
https://github.com/ChenPt/dailyNote/issues
0 stars 0 forks source link

4/10/Node 环境下的 event loop #1

Open ChenPt opened 6 years ago

ChenPt commented 6 years ago

event loop 是由runtime (执行环境)来实现的,而执行引擎要实现的是ECMAScript标准。

Node的event loop的实现是交给libuv库来实现的,而浏览器的event loop是由各家浏览器按照HTML标准去实现的,具体实现细节可能存在差异。

Node的event loop 与浏览器的event loop 是两种东西.

Node的event loop有六个阶段。

  1. Timers : 执行满足条件的定时器
  2. I/0 callbacks : 执行几乎所有 callback,除了 close callbacks,被 timers 调度的cb和 setImmediate()的cb
  3. idle,prepare : Node内部使用.
  4. poll : 等待还没完成的I/O事件, 在适当的条件下会阻塞在这个阶段(这个条件是 times 队列为空, 接下来没有setImmediate任务需要处理)
  5. check : 执行 setImmediate() 的回调
  6. close calllbacks : 执行close事件的callback,例如socket.on("close",func)

每一个阶段执行完进入下一个阶段之前会执行完nexttick queue & microtask queue里的所有任务,然后再进入下一阶段。