进程&线程&事件循环
进程和线程的关系
- Q:什么是进程和线程?
A:
进程( process ): 计算机已经运行的程序,是操作系统管理程序的一种方式
线程( thread ): 操作系统能够运行运算调度的最小单位,通常情况下包含在进程中,每个进程至少会有一个线程用来执行程序中的代码,一般称这个线程为主线程所以说 进程是线程的容器
JavaScript线程
- 定义: JavaScript是单线程的,进程容器就是: Node或者浏览器
这就意味着js的代码在同一时刻只能做一件事情,如果这件事非常耗时,就意味着当前的线程会被阻塞
所以真正耗时的操作(网络请求,定时器),不应该由js线程执行,而是通过浏览器的其它线程执行,js只需要在获取浏览器通知(事件循环)执行回调获取结果即可
注意: 浏览器是多进程的,当我们打开一个tab页就是一个新的进程,防止一个页面无响应需要重启这个浏览器,每个进程又有多个线程,其中包括了JavaScript代码的线程
事件循环
- 定义: JavaScript线程在执行时,遇到异步任务的代码,会将异步任务放入浏览器其它线程, 该线程会在某一时间将异步任务放入任务队列,js引擎会在任务队列中获取对应的函数并进行执行,执行完成后该事件就结束,整个闭环的就是事件循环
宏任务&微任务
宏任务:
script标签, 定时器,ajax, DOM操作, UI Rendering(UI渲染), I/O操作(读取文件之类)[node]
微任务:
queueMicrotask函数, Promise.then方法, process.nextTick [node]
规范: 在执行任何的宏任务之前,都需要先保证微任务队列已被清空
队列优先级
- main script中的代码优先执行(编写的顶层script代码)
- 在执行任何一个宏任务之前,都会先查看微任务队列中是否有任务需要执行
(1) 在宏任务执行之前,必须保证微任务队列是空的
(2) 如果微任务队列不为空,那么就优先执行微任务队列中的任务 - node中的process.nextTick()在同级微任务中是先执行的
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!