什么是Event
- 计时器到期了
- 文件可以读取了,读取出错了
- socket有内容了,关闭了
这些都是事件,分析以上三个例子:
事件一般分两种:内部和外部的
内部
比如:计时器
外部:
比如:文件,因为文件在硬盘上,硬盘和操作系统是分开两部分的
比如:socket,socket是另外一台机器传过来的。
什么是Loop
- loop就是循环,比如while(true)循环
- 由于事件是分优先级的,所以处理起来也是分先后的
例子
三种不同的事件
setTimeout(f1,100)
fs.readFile('/1.txt',f2)
server.on('close',f3)
如果同时触发上面三个事件,Node会怎么办
- 肯定会有某种顺序(优先级)
- 这种顺序应该是被规定的
- 所以即使是同时,也是会按照一定顺序的,否则就乱套了
顺序的规则是人为制定的
一般是:先处理文件的,然后到服务器请求的,最后到内部计时器的
就这样三种事件一直循环执行下去
小结
- 所以Nodejs需要按顺序轮询每种事件
- 这种轮询往往都是循环的, 1->2->3->1->2->3
- 把这个看成一个圈的话,就是一种循环,这就是loop
Event Loop
- 操作系统可以触发事件,JS可以处理事件
- EventLoop就是对事件处理顺序的管理
Event Loop顺序示意图
建议读官方文档,官方文档是最好理解eventloop顺序的
顺序:
一:看有没有timer:计时器,有得话先执行
二:其他的回调
三:空下来,看看有什么垃圾回收之类的 二和三一般忽略不计
所以一般是直接看 一 然后到四
四:poll阶段 轮询
这个阶段处理大部分的请求,比如说文件,如果能读的,就在这个阶段先读。处理http请求,这些东西都处理完了,再进入下一个阶段
五:check:检查setImmediate回调
六:最后看有没有socket关闭这么一个回调
这一到六到看完之后呢,再回到一,又重新往下看
重点阶段
因为如果没其他事的话,node不会一直这么傻的一直循环执行。
- 大部分事件都在poll阶段被处理,如文件,网络请求
- 每个poll的停留时长是有限制的,超过了这个时长,就会去一个阶段,做一次循环
翻译的官方文档:https://juejin.im/post/6844903582538399752
需要补充 更深入的eventloop知识,
如:nodejs的eventloop与js的eventloop的区别,v8的宏任务和微任务