skip to content
天真笔录

事件循环(eventloop)

/ 3 min read

事件循环原理

JS是单线程的,异步代码时如何执行? 因为浏览器是多线程的,异步任务是由浏览器的定时器线程处理。 浏览器也是多进程的,打开一个tab,至少要启动四个进程:浏览器主进程、渲染进程、网络进程、GPU进程

进程vs线程

进程

一个进程就是一个程序的运行实例 启动一个进程,系统会为它开辟一块内存,用来存放代码、运行中的数据和一个执行任务的主线程

浏览器的多进程:浏览器主进程、渲染进程层、插件进程、网络进程、GPU进程…

线程

线程可以启动多个并行处理任务,提升性能,但是它不能单独存在, 线程依赖进程管理和启动

浏览器的多线程:http线程、js引擎线程、定时器线程…

事件循环

  1. JS在解析时将同步代码放入执行栈
  2. 遇到异步任务时交给其他线程处理,异步任务完成后将回调放入任务队列
    • setTimeout:定时器线程
    • ajax:http线程
  3. 所有同步代码执行(出栈)完成后,去任务队列里取出已完成异步任务的回调加入执行栈继续执行
  4. 回调里遇到异步任务时再交给其他线程处理,如此循环往复,即事件循环

任务队列(宏任务vs微任务)

任务队列不止一个,按种类分为宏任务、微任务

宏任务

  • 宿主环境(浏览器)发起的任务称宏任务(重学前端)
  • 下次循环任务开始执行(队头执行)
  • 浏览器中的宏任务:setTimeout、setInterval、点击事件、键盘事件

微任务

  • JS引擎发起的任务
  • 本次循环结束后执行(队尾执行)
  • 浏览器中的微任务:Promise.then、Promise.catch
  • 微任务优先级通常会高于宏任务,先于宏任务执行

node事件循环