美文网首页
EventLoop是什么?

EventLoop是什么?

作者: 明明你也一样 | 来源:发表于2019-09-23 09:52 被阅读0次

前言

因为EventLoop是Node.js里的概念,所以我们要先搞清楚Node.js的运行机制。在说明Event Loop之前,先来了解另外两个东西。

Node.js和Chrome
EventLoop机制

可以说Node.js和Chrome是两个相同等级的东西。Node.js是一个平台,是JavaScript的运行环境,而JS引擎模块也只是它众多功能模块中的一个。Chrome同样也是一个平台,也有JavaScript的运行环境,也是它众多功能模块中的一个JS引擎模块,它还有其他的如网络模块、渲染模块、UI模块、插件等功能。

JS引擎是如何执行的?

JS引擎执行过程 JS代码执行顺序

上图大概说明了JS引擎的执行机制,因为JS引擎是单线程的,那么异步任务执行就会把线程阻塞,这个时候Chrome的JS引擎会去请它的兄弟--网络模块(C++实现)帮忙,网络模块会去帮它发请求,完成请求后再去通知JS执行

Event Loop 是什么 ?

EventLoop流程图

简单的来说就是 Event Loop 是一个程序结构,用于等待和分派消息和事件。我个人的理解是 JS 中的 Event Loop 是浏览器或 Node 的一种协调 JavaScript 单线程运行时不会阻塞的一种机制。官方文档给出了 EventLoop 执行流程的具体介绍,但只有几个阶段是对我们有用的,所以我们有了下面的简化版。

Node.js会在一开始初始化EventLoop,接着执行JS代码,然后运行EventLoop,过程如下图

Node.js执行过程

为了方便理解,我们需要记忆的只有timers、poll、check三个阶段。

EventLoop模型图
  • timers阶段任务队列会在计时结束后处理setTimeoutsetInterval的回调函数。
  • poll阶段会暂停并轮询setTimeout、setInterval计时器的时间是否达到,达到则继续循环至timers阶段执行回调。如果中途接受到其他如文件读取等其他异步操作,会等待操作完成再轮询。
  • check阶段任务队列专门执行setImmediate相关的任务

但是process.nextTick()需要单独记忆,它会在EventLoop的每个阶段执行之前调用。

Macro Task(宏任务) 和 Micro Task(微任务)

微任务和宏任务皆为异步任务,它们都属于一个队列,主要区别在于他们的执行顺序,Event Loop的走向和取值。那么他们之间到底有什么区别呢?

宏任务和微任务
  • 宏任务:包括整体代码script,setTimeout,setInterval、setImmediate。
  • 微任务:原生Promise(有些实现的promise将then方法放到了宏任务中)、process.nextTick、Object.observe(已废弃)、 MutationObserver记住就行了。

相关文章

网友评论

      本文标题:EventLoop是什么?

      本文链接:https://www.haomeiwen.com/subject/vfpjuctx.html