什么是Event

  • 计时器到期了
  • 文件可以读取了,读取出错了
  • socket有内容了,关闭了

这些都是事件,分析以上三个例子:
事件一般分两种:内部和外部的

内部
比如:计时器

外部:
比如:文件,因为文件在硬盘上,硬盘和操作系统是分开两部分的
比如:socket,socket是另外一台机器传过来的。

什么是Loop

  • loop就是循环,比如while(true)循环
  • 由于事件是分优先级的,所以处理起来也是分先后的

例子

三种不同的事件

  1. setTimeout(f1,100)
  2. fs.readFile('/1.txt',f2)
  3. server.on('close',f3)

如果同时触发上面三个事件,Node会怎么办

  • 肯定会有某种顺序(优先级)
  • 这种顺序应该是被规定的
  • 所以即使是同时,也是会按照一定顺序的,否则就乱套了

顺序的规则是人为制定的
一般是:先处理文件的,然后到服务器请求的,最后到内部计时器的
就这样三种事件一直循环执行下去

小结

  • 所以Nodejs需要按顺序轮询每种事件
  • 这种轮询往往都是循环的, 1->2->3->1->2->3
  • 把这个看成一个圈的话,就是一种循环,这就是loop

Event Loop

  • 操作系统可以触发事件,JS可以处理事件
  • EventLoop就是对事件处理顺序的管理

Event Loop顺序示意图

建议读官方文档,官方文档是最好理解eventloop顺序的
image.png
顺序:
一:看有没有timer:计时器,有得话先执行
二:其他的回调
三:空下来,看看有什么垃圾回收之类的 二和三一般忽略不计
所以一般是直接看 一 然后到四
四:poll阶段 轮询
这个阶段处理大部分的请求,比如说文件,如果能读的,就在这个阶段先读。处理http请求,这些东西都处理完了,再进入下一个阶段
五:check:检查setImmediate回调
六:最后看有没有socket关闭这么一个回调
这一到六到看完之后呢,再回到一,又重新往下看

重点阶段

  • timers检查计时器
  • poll轮询,检查系统事件
  • check检查setImmediate回调
  • 其他阶段用的比较少

    注意

  • 大部分事件,nodejs都停在poll轮询阶段。

因为如果没其他事的话,node不会一直这么傻的一直循环执行。

  • 大部分事件都在poll阶段被处理,如文件,网络请求
  • 每个poll的停留时长是有限制的,超过了这个时长,就会去一个阶段,做一次循环

翻译的官方文档:https://juejin.im/post/6844903582538399752

需要补充 更深入的eventloop知识,
如:nodejs的eventloop与js的eventloop的区别,v8的宏任务和微任务