全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📝 1 篇文章 20 道配套习题

NodeJS事件循环与异步模型

专题说明

本专题深入讲解Node.js事件循环机制和异步编程模型,从六个阶段的执行流程到微任务宏任务的优先级,再到libuv线程池的调度原理,帮助开发者从根本上理解Node.js异步非阻塞的实现机制。

学习目标

  1. 掌握事件循环六个阶段的职责和执行顺序
  2. 理解微任务(nextTick、Promise)与宏任务的执行优先级
  3. 了解process.nextTick的特点和使用注意事项
  4. 理解异步I/O回调的执行时机分配
  5. 掌握libuv线程池的作用和配置方法

学习内容

本专题覆盖以下核心知识点:

知识点核心内容题目数量
事件循环机制六个阶段、poll入口、阶段职责4题
微任务与宏任务分类、优先级、执行时机4题
process.nextTick执行时机、I/O饥饿、递归风险4题
setTimeout与setImmediate执行阶段、执行顺序比较2题
异步I/O与回调回调阶段分配、执行时机2题
并发模型与线程池libuv线程池、UV_THREADPOOL_SIZE4题

学习建议

  1. 先理解事件循环的六个阶段,建立整体框架
  2. 重点掌握微任务优先级:nextTick > Promise > 宏任务
  3. 注意process.nextTick可能导致I/O饥饿的风险
  4. 理解setTimeout与setImmediate在不同场景下的执行顺序差异
  5. 了解线程池默认大小和配置方法,优化I/O密集型应用

📝 发现内容有误?点击此处直接编辑

📝 配套习题(20 题)

1
单选题

关于Node.js事件循环的六个阶段,以下说法正确的是?

A

timers阶段执行所有到期定时器的回调,然后立即进入pending callbacks阶段

B

poll阶段是事件循环的入口点,负责执行I/O事件回调

C

check阶段在poll阶段之前执行,专门处理setImmediate回调

D

close callbacks阶段会阻塞事件循环直到所有句柄关闭

2
单选题

在Node.js事件循环中,pending callbacks阶段的主要作用是?

A

执行所有被延迟执行的回调函数

B

执行系统操作(如TCP错误)的回调

C

执行setImmediate注册的回调

D

执行nextTick队列中的回调

3
多选题

以下关于Node.js事件循环的说法,正确的是?(多选)

A

timers阶段按照定时器注册顺序执行回调

B

poll阶段可能会阻塞等待I/O事件

C

check阶段专门用于执行setImmediate回调

D

事件循环会在每个阶段之间执行微任务队列

E

一个阶段内的所有回调执行完毕后才会进入下一阶段

4
判断题

Node.js的事件循环运行在独立的线程中,与主线程并行执行,从而实现非阻塞I/O。

A

B

5
单选题

在Node.js中,以下哪个属于微任务(Microtask)?

A

setTimeout回调

B

setImmediate回调

C

process.nextTick回调

D

setInterval回调

6
单选题

关于Node.js中微任务队列的执行顺序,以下说法正确的是?

A

Promise队列先于nextTick队列执行

B

nextTick队列先于Promise队列执行

C

两个队列交替执行,各执行一个任务

D

两个队列同时并行执行

7
多选题

以下代码执行后,控制台输出的顺序包含哪些特点?(多选)

JavaScript
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
process.nextTick(() => console.log('4'));
console.log('5');
A

'1'最先输出

B

'4'比'3'先输出

C

'3'比'2'先输出

D

'2'最后输出

E

'5'比'4'先输出

8
判断题

在Node.js事件循环中,微任务队列会在每个阶段结束时清空,而宏任务队列则按事件循环阶段顺序执行。

A

B

9
单选题

关于process.nextTick(),以下说法正确的是?

A

nextTick回调在事件循环的下一轮执行

B

nextTick回调在当前操作完成后、事件循环继续之前执行

C

nextTick回调与Promise.then回调同时执行

D

nextTick回调在setTimeout回调之前、Promise回调之后执行

10
单选题

以下代码的输出结果是什么?

JavaScript
function recursive() {
  process.nextTick(recursive);
}
recursive();
console.log('end');
A

输出"end"后程序正常结束

B

输出"end"后继续无限执行nextTick

C

程序立即崩溃,抛出RangeError

D

先输出"end",然后抛出RangeError: Maximum call stack size exceeded

11
多选题

以下关于process.nextTick()的使用,正确的是?(多选)

A

适合在同步代码执行后立即执行某些操作

B

可以用于确保回调在事件循环继续之前执行

C

应该避免递归调用process.nextTick以防止I/O饥饿

D

process.nextTick的优先级高于Promise.then

E

process.nextTick回调在当前函数调用栈清空后立即执行

12
判断题
A

B

13
单选题

以下代码中,setTimeout的实际延迟时间可能超过100ms的原因是?

JavaScript
setTimeout(() => console.log('done'), 100);
A

setTimeout的最小延迟是4ms,所以会超过100ms

B

如果事件循环在poll阶段被阻塞,回调执行会被延迟

C

setTimeout使用的是系统定时器,精度只有10ms

D

Node.js不支持精确的定时器功能

14
判断题

Node.js中所有的异步I/O回调都在poll阶段执行,包括定时器回调。

A

B

15
单选题

以下代码的执行结果是什么?

JavaScript
async function test() {
  console.log('start');
  await Promise.resolve();
  console.log('end');
}
test();
console.log('main');
A

start → end → main

B

start → main → end

C

main → start → end

D

start → end(main不会输出)

16
单选题

libuv线程池主要用于处理哪些类型的操作?

A

所有的异步I/O操作

B

网络I/O操作(TCP、UDP)

C

不支持原生异步I/O的操作(如文件系统、DNS解析)

D

Promise的异步执行

17
单选题

关于libuv线程池,以下说法正确的是?

A

线程池默认大小为4,可以通过UV_THREADPOOL_SIZE调整

B

线程池大小可以无限增大以提高性能

C

所有文件系统操作使用独立的线程池

D

线程池任务完成后会阻塞事件循环等待回调执行

18
多选题

以下代码执行时,哪些说法正确?(多选)

JavaScript
const fs = require('fs');
// 同时发起5个文件读取请求
for (let i = 0; i < 5; i++) {
  fs.readFile(`file${i}.txt`, (err, data) => console.log(`file${i}`));
}
A

5个请求使用libuv线程池处理

B

如果线程池默认4线程,最多4个文件可同时读取

C

第5个请求必须等待前面的请求完成才能开始

D

5个回调的执行顺序取决于文件读取完成顺序

E

可以通过增大UV_THREADPOOL_SIZE让5个请求同时并行读取

19
填空题

Node.js的事件驱动架构基于____________类实现,核心是________模式。当异步I/O操作完成时,会触发对应的______,执行注册的________。这种方式使得Node.js可以在______中高效处理大量______请求,避免了传统多线程模型的______________问题。

20
填空题

Node.js事件循环分为六个阶段:______________________________________________________________。每个阶段结束后会清空______队列,执行顺序是先________队列后_______队列。setTimeout/setInterval回调在______阶段执行,setImmediate回调在______阶段执行,I/O回调主要在______阶段执行。

← 上一个专题 JS模块化与工程化基础
下一个专题 → NodeJS事件驱动基础专题

📝 发现内容有误?点击此处直接编辑

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库