资讯专栏INFORMATION COLUMN

浅析Js Event Loop

forrest23 / 2527人阅读

摘要:一旦为空事件循环将检查,如果一个或多个定时器准备就绪,事件循环将回绕到阶段以执行那些的回调。此阶段允许人员在轮询阶段完成后立即执行回调。否则它将通过发射。

什么是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...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102988.html

相关文章

  • 浅析 JS 中的 EventLoop 事件循环(新手向)

    摘要:同时,如果执行的过程中发现其他函数,继续入栈然后执行。上面我们讨论的其实都是同步代码,代码在运行的时候只用调用栈解释就可以了。 序 Event Loop 这个概念相信大家或多或少都了解过,但是有一次被一个小伙伴问到它具体的原理的时候,感觉自己只知道个大概印象,于是计划着写一篇文章,用输出倒逼输入,让自己重新学习这个概念,同时也能帮助更多的人理解它~ 概念 JavaScript 是一门 ...

    chadLi 评论0 收藏0
  • 浅析 JS 事件循环之 Microtask 和 Macrotask

    摘要:常见应用则是为了完成一些更新应用程序状态的较小的任务,如处理的回调和的修改,以便让这些任务在浏览器重新渲染之前执行。常见应用执行顺序的实现需要至少一个和至少一个。 简介 我们在上一篇 《浅析 JS 中的EventLoop 事件循环》 中提到一个 Event Queue,其实在事件循环中 queue 一共有两种,还有一种叫 Job Queue 其中 Event Queue 在 HTML...

    sihai 评论0 收藏0
  • js_Event Loop(笔记)

    摘要:单线程的好处简单,处理时不会出现并发竞争问题异步的必要性让用户体验更流畅如何实现异步见参考,,调用栈函数执行上下文。单线程只能有一个并且每次只能执行一个任务。 参考: JavaScript 运行机制详解:再谈Event Loop 深入理解JavaScript的执行过程--单线程的JS 细说JavaScript单线程的一些事 The JavaScript Event Loop: Exp...

    liaoyg8023 评论0 收藏0
  • Node.js浅析高并发与分布式集群

    摘要:而在单线程环境下,绕不过错误就意味着导致应用退出,重启恢复的间隙会导致服务中断,这是我们不愿意看到的。这也是支持高并发的重要原因之一实际上不光是操作,的绝大多数操作都是以这种异步的方式进行的。 本文首发于我的个人博客: kmknkk.xin 不足之处欢迎斧正! Node特性:高并发 在解释node为什么能够做到高并发之前,不妨先了解一下node的其他几个特性: 单线程 我们先来明确...

    Lin_YT 评论0 收藏0
  • Event Loop - JS执行机制

    摘要:心塞塞根据规范,事件循环是通过任务队列的机制来进行协调的。等便是任务源,而进入任务队列的是他们指定的具体执行任务回调函数。然后当前本轮的结束,主线程可以继续取下一个执行。 依然是:经济基础决定上层建筑。 说明 首先,旨在搞清常用的同步异步执行机制 其次,暂时不讨论node.js的Event Loop执行机制,以下关于浏览器的Event Loop执行机制 最后,借鉴了很多前辈的研究文...

    muddyway 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<