JavaScript事件循环机制和NodeJS时间循环机制
2022-11-27 本文已影响0人
Poppy11
JavaScript事件循环机制
image.png一、是什么?
JavaScript是一门单线程语言,同一时间只能做一件事,但并不意味着单线程就是阻塞,而实现单线程非阻塞的方式就是事件循环。
JavaScript中,所有的任务都可以分为:
- 同步任务:立即执行的任务,同步任务一般会直接进入到主线程中执行
- 异步任务:异步执行的任务,例如ajax请求,或者setTimeout函数
从上面可以看出,同步任务进入主线程,异步任务进入任务队列,主线程内的任务执行完毕为空,会去读取任务队列对应的任务,推入主线程执行。上述过程不断重复就是事件循环机制。
二、宏任务与微任务
异步任务又分为宏任务与微任务
微任务
- script (可以理解为外层同步代码)
- setTimeout/setInterval
- setImmediate、I/O(Node.js)
微任务
- Promise.then
- process.nextTick(NodeJS)
执行宏任务时,遇到微任务就放入微任务任务队列中,当宏任务执行完成后,会查看微任务的事件队列,然后将微任务依次执行完,再进行循环执行下一个宏任务。
NodeJS事件循环机制
image.png- Timers:用于存储定时器额回调函数(setInterval,setTimeout)
- Pending callbacks:执行与操作系统相关的回调函数,比如启动服务器端应用时监听端口操作的回调函数就在这里调用。
- 闲置阶段(idle, prepare):仅系统内部使用
- 轮询阶段(poll):检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有情况下,除了关闭的回调函数,那些由计时器和 setImmediate() 调度的之外),其余情况 node 将在适当的时候在此阻塞
- 检查阶段(check):setImmediate() 回调函数在这里执行
- 关闭事件回调阶段(close callback):一些关闭的回调函数,例如关闭数据库连接的回调