图文结合带你搞懂Nodejs中的事件循环

本篇文章通过图文结合的形式来带大家搞懂Nodejs中的事件循环,希望对大家有所帮助!

以下全文7000字,请在你思路清晰、精力充沛的时刻观看。保证你理解后很长时间忘不掉。【推荐学习:《nodejs 教程》】

1.png

Node事件循环

Node底层使用的语言libuv,是一个c++语言。他用来操作底层的操作系统,封装了操作系统的接口。Node的事件循环也是用libuv来写的,所以Node生命周期和浏览器的还是有区别的。

因为Node和操作系统打交道,所以事件循环比较复杂,也有一些自己特有的API。
事件循环在不同的操作系统里有一些细微的差异。这将涉及到操作系统的知识,暂时不表。 本次只介绍JS主线程中,Node的运作流程。Node的其他线程暂时也不扩展。

事件循环图

说好的一张图,也不卖关子。下边这张图搞清楚了,事件循环就学会了。

2.png

事件循环图

3.png

事件循环图-结构

为了让大家先有个大局观,先贴一张目录结构图在前边:

4.png

目录

接下来详细展开说说

主线程

5.png

主线程

上图中,几个色块的含义:

  • main:启动入口文件,运行主函数
  • event loop:检查是否要进入事件循环
    • 检查其他线程里是否还有待处理事项
    • 检查其他任务是否还在进行中(比如计时器、文件读取操作等任务是否完成)
    • 有以上情况,进入事件循环,运行其他任务
      事件循环的过程:沿着从timers到close callbacks这个流程,走一圈。到event loop看是否结束,没结束再走一圈。
  • over:所有的事情都完毕,结束

事件循环 圈

6.png

事件循环 圈

图中灰色的圈跟操作系统有关系,不是本章解析重点。重点关注黄色、橙色的圈还有中间橘黄的方框。

我们把每一圈的事件循环叫做「一次循环」、又叫「一次轮询」、又叫「一次Tick」。

一次循环要经过六个阶段:

  • timers:计时器(setTimeout、setInterval等的回调函数存放在里边)

  • pending callback

  • idle prepare

  • poll:轮询队列(除timers、check之外的回调存放在这里)

郑重声明:本文版权包含图片归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们(delete@yzlfxy.com)修改或删除,多谢。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

留言与评论(共有 0 条评论)
昵称:
匿名发表
   
验证码: