发布于 2026-01-06 2 阅读
0

Node.js 事件循环

Node.js 事件循环

Node.js 事件循环是理解 Node.js 如何管理异步操作和处理并发的关键概念。Node.js 被设计成非阻塞和异步的,这使其能够高效地处理大量 I/O 密集型操作,而不会被任何单个操作阻塞。

以下是Node.js事件循环的工作原理:

  1. 事件循环:事件循环是 Node.js 的核心组件,它管理所有异步操作。它会不断检查事件队列中的新事件,并循环处理它们。

  2. 事件队列:事件队列保存各种类型的事件,例如回调、定时器和 I/O 事件,这些事件是由异步操作产生的。这些事件在触发时会被添加到队列中,但不会立即执行。

  3. 回调函数:回调函数是作为异步函数的参数传递的函数。当相应的异步操作完成且事件循环到达队列中的相应事件时,回调函数就会被执行。这种机制使得 Node.js 能够在不等待一个任务完成的情况下执行下一个任务。

  4. 定时器: Node.js 提供了两种类型的定时器:setTimeout() 和 setInterval()。这些定时器用于安排回调函数在指定的时间后或按固定的时间间隔执行。

  5. I/O 操作:当 Node.js 执行 I/O 操作(例如,读取或写入文件、发出网络请求)时,它不会阻塞程序其余部分的执行。相反,它会将 I/O 操作委托给操作系统,并注册一个回调函数,以便在操作完成后执行。

  6. 微任务队列:除了事件队列之外,Node.js 还维护着一个微任务队列。微任务的优先级高于常规回调函数,会在事件循环的下一次迭代之前执行。Promise 和某些 API(例如 `process.nextTick()`)会将任务添加到微任务队列中。

Node.js 事件循环的工作原理
以下是事件循环工作原理的简化分步分解:

  1. 检查事件队列中是否有待处理的事件。

  2. 如果存在待处理的事件,则从队列中取出事件并执行其关联的回调函数。

  3. 执行微任务队列中的所有微任务。

  4. 执行所有就绪的 I/O 操作。

  5. 检查是否有已定时触发的定时器超时。如果有,则执行其回调函数。

  6. 从步骤 1 开始重复该过程。

事件循环允许 Node.js 并发处理多个任务,而无需为每个任务创建单独的线程。这种并发模型对于 I/O 密集型操作非常高效,但需要注意的是,CPU 密集型操作仍然会阻塞事件循环,因此应该将其卸载到工作线程或其他进程中,以保持应用程序的响应速度。

要点:

  • 事件循环是一个单线程循环,这意味着一次只能执行一个任务。但是,事件循环可以通过非阻塞的方式并发处理多个任务。

  • 事件队列是一个 FIFO(先进先出)队列,这意味着事件是按照添加到队列中的顺序进行处理的。

  • 微任务会在常规回调之前执行,这意味着它们的优先级更高。这是因为微任务通常用于执行与事件循环本身相关的任务,例如调度定时器和处理 I/O 事件。

  • 事件循环可能会被 CPU 密集型操作阻塞,这些操作需要大量的处理能力。为了避免阻塞事件循环,应该将 CPU 密集型操作卸载到工作线程或其他进程中。

希望您喜欢这篇文章,请点赞。关注我们,获取更多内容。

文章来源:https://dev.to/endeavourmonk/nodejs-event-loop-46oo