什么是Event Loop?
官网诠释
个人明白是js的单线程是他的使命栈是单线程,但他处置惩罚异步i/o的要领是依靠libuv开启线程池去处置惩罚,完成以后使命加到poll queue里,然后等使命栈的使命为空或事宜抵达阀值时,把poll queue和定时器的使命加到使命栈里,继承这个轮回,这就是大体上的js的Event Loop。
构造
┌───────────────────────────┐
┌─>│ timers │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │ pending callbacks │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │ idle, prepare │
│ └─────────────┬─────────────┘ ┌───────────────┐
│ ┌─────────────┴─────────────┐ │ incoming: │
│ │ poll │<─────┤ connections, │
│ └─────────────┬─────────────┘ │ data, etc. │
│ ┌─────────────┴─────────────┐ └───────────────┘
│ │ check │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
└──┤ close callbacks │
└───────────────────────────┘
timer:
定时使命,当抵达阀值时,他不会马上实行,会守候使命栈的使命会壅塞他。
pending callbacks:
此阶段实行某些体系操纵(比方TCP毛病范例)的回调。比方,假如TCP套接字在尝试衔接时收到,则某些*nix体系愿望守候报告毛病。这将列队守候在挂起的回调阶段实行。
pull:
这个阶段有两个主要功能:
盘算它应当壅塞和轮询I / O的时候,然后
处置惩罚轮询行列中的事宜。
当事宜轮回进入轮询阶段而且没有设计定时器时,将发作以下两种状况之一:
假如轮询行列不为空,则事宜轮回将遍历其同步实行它们的回调行列,直到行列已用尽,或许到达体系相干的硬限定。
假如轮询行列为空,则会发作以下两种状况之一:
假如剧本已实行setImmediate,则事宜轮回将完毕poll阶段并继承实行check阶段以实行这些调理剧本。
假如剧本没有实行setImmediate,事宜轮回将守候回调被添加到poll queue中,然后马上实行。
一旦poll queue为空事宜轮回将搜检timer,假如一个或多个定时器准备就绪,事宜轮回将回绕到timer阶段以实行那些timer的回调。
check
此阶段许可职员在轮询阶段完成后马上实行回调 。假如轮询阶段变成余暇而且存在setImmediate使命,那末事宜轮回直接跳到check实行而不是壅塞在poll阶段守候回调被到场。
setImmediate实际上是一个特别的计时器,它在事宜轮回的一个零丁阶段运转。它运用libuv API来调理在轮询阶段完成后实行的回调。
close callbacks
假如socket或handle倏忽封闭(比方socket.destroy()),则该 ‘close’事宜将在此阶段发出。不然它将经由过程发射process.nextTick()。
援用: