Node.js 中的事件循环如何工作?

PHPz
发布: 2024-08-17 20:31:37
原创
265 人浏览过

How event loop work in Node.js?

事件循环是 Node.js 中的核心概念,使其能够高效地处理异步操作。这是其工作原理的简化说明:

1. 单线程性质

Node.js 在单线程上运行。这意味着它一次只能执行一段代码。然而,Node.js 被设计为可以同时处理许多操作,而不需要多个线程。

2. 非阻塞I/O

Node.js 使用非阻塞 I/O 操作。当 Node.js 执行读取文件、查询数据库或发出网络请求等任务时,它不会等待这些任务完成就继续执行下一个任务。相反,它在处理这些任务时继续执行其他代码。

3. 事件循环机制

事件循环负责管理代码的执行和处理异步事件。它不断检查任务“队列”并决定执行哪些任务。这是一步一步的细分:

  • Initialize:当 Node.js 应用程序启动时,它会初始化并设置环境。
  • 执行阶段:Node.js 同步执行任何初始代码。如果有异步任务(如文件读取或 HTTP 请求),它们将被移交给系统的 API。
  • 事件循环阶段:事件循环有多个阶段,并且它按特定顺序处理每个阶段中的任务:
    • 定时器阶段:执行由 setTimeout() 和 setInterval() 安排的回调。
    • IO Callbacks Phase:执行 I/O 操作的回调,例如文件读取或网络请求。
    • 空闲,准备阶段:用于系统任务的内部阶段。
    • 轮询阶段:检索新的 I/O 事件,执行它们的回调。如果 poll 队列为空,则会检查 setImmediate() 队列中是否有回调。
    • 检查阶段:执行由setImmediate()安排的回调。
    • 关闭回调阶段:处理关闭事件,例如由socket.on('close')发出的事件。
  • 重新检查并退出:如果事件循环没有更多任务要处理,它将退出,让程序终止。如果还有待处理的任务,它将继续运行。

4. 回调队列

异步任务完成后,将其回调推送到队列中。事件循环从队列中选取这些回调并按顺序执行它们。

5.微任务队列(下一个Tick)

除了主队列之外,还有一个微任务队列(或下一个刻度队列),其中使用 process.nextTick() 或 Promise 的 .then() 处理程序调度的回调排队。微任务优先于常规回调,这意味着它们在当前操作完成之后、事件循环进入下一阶段之前执行。

例子

这里有一个简单的例子来说明事件循环是如何工作的:

雷雷

输出:

雷雷

说明:

  1. console.log('开始');和 console.log('结束');同步执行。
  2. fs.readFile 发起异步文件读取操作,无需等待,继续执行下一行代码。
  3. 文件读取操作完成后,其回调 (console.log('File readcomplete');) 会被推送到事件循环的回调队列中。
  4. 事件循环在同步代码执行完成后处理回调。

事件循环允许 Node.js 通过将操作委托给系统并异步处理其结果,尽管是单线程的,但仍可以高效地同时处理多个操作。

事件循环编排任务的执行,优先考虑微任务队列,以确保在继续处理主任务队列(宏任务)中的任务之前快速解决承诺和相关操作。

这种动态使 JavaScript 能够在单线程环境中处理复杂的异步行为。

以上是Node.js 中的事件循环如何工作?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!