node事件循环

node.js事件循环

  • 要想了解nodejs的事件循环机制,首先要明白微任务和宏任务有哪些,并且了解其执行顺序的差异

nodejs的微任务

在node.js中微任务包含2种:process.nextTick和Promise。微任务在事件循环中优先级是最高的,在同一事件循环中有其他任为存在时,优先执行微任务队列,且process.nextTick和Promise也存在优先级,process.nextTick高于Promise

宏任务

在node.js中宏任为包含4种:setTimeout、setInterval、setImmediate和I/O,没有先后顺序,宏任务执行在微任务后,在同个事件循环周期内,即存在微任务又存在宏任务队列那优先级将微任务队列清空,再执行宏任务队列

了解完微任务和宏任务后来看一张图,了解一下具体的循环过程

在这里下图片描述

事件循环开始后会首先执行主线程上的任务,然后将任为划分为微任务和宏任务,微任务会在宏任务执行前执行;主线程任务执行完成后会继续执行callback回调,继续将任务划分为微任务和宏任务。

  • 到这里就会有疑问,这样主线程会阻塞吗?事件循环会一直执行吗?

当主线程中存在阻塞逻辑的时候,会造成线程的阻塞,尽管有些任务已经执行完成了,也只能等待
当所有的微任务和宏任务都清空的时候,虽然当前没有任务可执行了,但是也并不能代表循环结束了。因为可能存在当前还未回调的异步 I/O,所以这个循环是没有终点的,只要进程在,并且有新的任务存在,就会去执行。

node事件循环原理

  • 这一流程包含 6 个阶段,每个阶段代表的含义如下所示。

(1)timers:本阶段执行已经被 setTimeout() 和 setInterval() 调度的回调函数,简单理解就是由这两个函数启动的回调函数。

(2)pending callbacks:本阶段执行某些系统操作(如 TCP 错误类型)的回调函数。

(3)idle、prepare:仅系统内部使用,你只需要知道有这 2 个阶段就可以。

(4)poll:检索新的 I/O 事件,执行与 I/O 相关的回调,其他情况 Node.js 将在适当的时候在此阻塞。这也是最复杂的一个阶段,所有的事件循环以及回调处理都在这个阶段执行,接下来会详细分析这个过程。

(5)check:setImmediate() 回调函数在这里执行,setImmediate 并不是立马执行,而是当事件循环 poll 中没有新的事件处理时就执行该部分
在这里插入图片描述

最后也来阐述下对node到底是单线程还是多线程的理解

主线程是单线程执行的,但是 Node.js 存在多线程执行,多线程包括 setTimeout 和异步 I/O 事件。其实 Node.js 还存在其他的线程,包括垃圾回收、内存优化等

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值