理解浏览器和nodeJs中的事件循环(Event Loop)

浏览器环境下 js 引擎的事件循环机制

js 引擎每次只能执行一个操作,而通常情况下操作又不止一个,因此这些操作会被依次放入一个队列中,js 引擎会按照队列中的顺序去执行操作,这个队列叫做执行栈。
当执行栈中要执行异步任务时,js 引擎会暂时将它挂起,继续执行执行栈中的其他任务。
当异步任务返回结果后,js 引擎会将事件加入到与当前执行栈不同的另一个队列,我们称之为事件队列。
js 引擎不会立即执行事件队列里的任务,而是执行栈中的所有任务执行完,主线程处于闲置状态时,js引擎才会把事件队列里的事件对应的回调拿出来放到执行栈中执行。
如此反复,就形成了无限循环,这就是称之为“事件循环”的原因。
其实,异步任务的执行顺序也是有优先级的。我们把异步任务分为两类:微任务(micro task)和宏任务(macro task)
复制代码

微任务如:

new Promise()

new MutaionObserver()
复制代码

宏任务如:

setInterval()

setTimeout()

setImmediate()
复制代码

  

 如果你理解了下面代码的先后输出也就理解了浏览器的事件环。

setTimeout(function(){
    console.log('setTimeout1');
  Promise.resolve().then(function(){
    console.log('Promise')
  })
})
setTimeout(function(){
  console.log('setTimeout2');
})
复制代码

浏览器的输出为:setTimeout1 Promise setTimeout2(不懂promise的请看我的上一篇随笔~)

node的输出为:setTimeout1 setTimeout2 Promise
复制代码

node.js下的事件循环机制

Node的“事件循环”(Event Loop)是它能够处理大并发、高吞吐量的核心。这是最神奇的地方,据此Node.js基本上可以理解成“单线程”,同时还允许在后台处理任意的操作。

Node采用单线程的处理机制,对所有的I/O请求采用非堵塞的工作方式。也就是说,对于http的请求,数据查询,文件的I/O等其他操作,系统不会堵塞当前线程而去等待他直到他返回结果;
复制代码

下面来看下node事件循环包含的几个阶段:

1. timers:执行setTimeout()和setInterval安排的回调

2. I/O callbacks: 执行几乎所有异常的close回调,由timer和setImmediate执行的回调。idle,prepare: 只用于内部

3. poll : 获取新的I/O事件,node在该阶段会适当的阻塞

4. check : setImmediate的回调被调用

5. close callbacks 阶段: 比如socket.on(‘close’, callback)的callback会在这个阶段执行

在每次运行事件循环之间,node.j检查是否有正在等待的异步i/o调用、timers等。如果没有,就清除并结束(退出程序),例如:执行一个程序,
仅有一句话(let a= ‘hello’;),处理完目标代码后,不会进入evetloop,而是直接结束程序。
poll阶段在node.js里,除了上面几个特定阶段的callback之外,任何异步方法完成时,都会将其callback加到poll queue里。
setInterval都是在poll 阶段执行完当前的I/O队列中相应的回调函数后触发的。
但是这两个函数却是由不同的路径触发的
process.nextTick()不在event loop的任何阶段执行,而是在各个阶段切换的中间执行,即从一个阶段切换到下个阶段前执行。
process.nextTick()是node早期版本无setImmediate时的产物,node作者推荐我们尽量使用setImmediate。
复制代码

以上是本人对这两方面的见解,仅供参考。

转载于:https://juejin.im/post/5acac9dd6fb9a028e1203dbd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值