Event Loop是一个程序结构,用于等待和发送消息和事件。
Web
JS引擎线程负责执行JS的主线程,"JS是单线程的"就是指的这个线程,这个线程跟渲染页面的GUI线程是互斥的。
- 主线程每次执行时,遇到同步任务就一直执行完
- 遇到异步API就将它交给对应的异步线程,自己继续往下执行同步任务
- 异步线程执行异步API完成后,将异步回调事件放入事件队列上
- 主线程同步任务完成后,看事件队列有任务就取出执行,然后不断循环该流程
事件循环中的异步队列有两种:macro(宏任务,如setTimeout、setInterval、 setImmediate、 I/O 操作、UI 渲染等)队列和 micro(微任务,如Promise().then、MutationObserver等)队列。宏任务队列可以有多个,微任务队列只有一个。
当事件循环遍历队列时,先检查微任务队列,如果里面有任务,就全部拿来执行,执行完之后再执行一个宏任务。执行每个宏任务之前都要检查下微任务队列是否有任务,如果有,优先执行微任务队列。
Node
- 定时器(timers):执行已经被 setTimeout() 和 setInterval() 的调度回调函数。
- 待定回调(pending callbacks):执行延迟到下一个循环迭代的 I/O 回调。
- idle, prepare:仅系统内部使用。
- 轮询(poll):检索新的 I/O 事件;执行与 I/O 相关的回调。
- 检测(check):setImmediate() 回调函数在这里执行。
- 关闭的回调函数(close callbacks):一些关闭的回调函数,如:socket.on('close', ...)。
process.nextTick()不属于任何的Event Loop阶段,真正的立即执行。
setImmediate() 在事件循环的接下来的迭代或 'tick' 上触发。
学习资料:
- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop
- https://nodejs.org/zh-cn/docs/guides/event-loop-timers-and-nexttick/#what-is-the-event-loop
- https://juejin.im/post/5e782486518825490455fb17
- https://blog.fundebug.com/2019/01/15/diffrences-of-browser-and-node-in-event-loop/
- http://www.ruanyifeng.com/blog/2013/10/event_loop.html
网友评论