视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JavaScript中EventLoop的分析
2020-11-27 19:26:57 责编:小采
文档
本篇文章给大家带来的内容是关于JavaScript中Event Loop的分析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

什么是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()。

本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的JavaScript视频教程栏目!

下载本文
显示全文
专题