浅析Js Event Loop

什么是Event Loop?

官网诠释

《浅析Js 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()。

援用:

https://nodejs.org/en/docs/gu…

    原文作者:fuqihan
    原文地址: https://segmentfault.com/a/1190000018652073
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞