你已经使用 Node.js 一段时间了,构建了一些应用程序,尝试了不同的模块 , 甚至对异步编程感到很舒适 。但是有些事情一直在困扰着你——事件循环(Event Loop) 。
如果你像我一样,花费了无数个小时阅读文档和观看视频,试图理解事件循环 。但即使作为一个经验丰富的开发者 , 在完全理解它如何工作方面也可能会遇到困难 。这就是为什么我准备了这份视觉指南,帮助您充分理解 Node.js 事件循环 。请坐下来,拿杯咖啡,让我们深入探索 Node.js 事件循环的世界吧 。
JAVAScript 中的异步编程我们将从 JavaScript 中异步编程的复习开始 。虽然 JavaScript 在 Web、移动和桌面应用程序中都有使用,但重要的是要记住,本质上 , JavaScript 是一种同步、阻塞、单线程的语言 。让我们通过一个简短的代码片段来理解这句话 。
// index.jsfunction A() {console.log("A");}function B() {console.log("B");}A()B()// Logs A and then BJavaScript 是同步的如果我们有两个将消息记录到控制台的函数,那么代码会自上而下执行 , 每次只执行一行 。在上述代码片段中 , 我们看到 A 在 B 之前被记录 。
JavaScript 是阻塞的JavaScript 由于其同步性质而被阻塞 。无论前一个进程需要多长时间,后续进程都不会启动,直到前者完成为止 。在代码片段中,如果函数 A 必须执行大量代码块,则 JavaScript 必须在没有转移到函数 B 的情况下完成该操作 。即便这块代码需要耗时 10 秒甚至 1 分钟 。
你可能已经在浏览器中遇到过这种情况 。当 Web 应用程序在浏览器中运行并且执行一些密集的代码块而不返回控制权给浏览器时,浏览器可能会出现卡死的情况,这就是所谓的阻塞 。浏览器被阻止继续处理用户输入和执行其他任务,直到 Web 应用程序将处理器控制权归还给浏览器 。
JavaScript 是单线程的线程就是你的 JavaScript 程序可以用来运行任务的进程(process) 。每个线程一次只能执行一个任务 。与其他支持多线程并且可以同时运行多个任务的语言不同,JavaScript 只有一个称为主线程的线程执行代码 。
等待 JavaScript如你所想,这种 JavaScript 模型会带来问题,因为我们必须等待数据被获取后才能继续执行代码 。这个等待可能需要几秒钟,在此期间我们无法运行任何其他代码 。如果 JavaScript 在不等待的情况下继续处理 , 就会出错 。我们需要在 JavaScript 中实现异步行为 。我们进到 Node.js 看一下 。
Node.js 运行时

文章插图
Node.js 运行时是一个环境 , 你可以在不使用浏览器的情况下使用和运行 JavaScript 程序 。核心——Node 运行时,由三个主要组件组成 。
- 外部依赖项 —— 例如 V8、libuv、crypto 等——是 Node.js 必需的功能
- C++ 特性提供了文件系统访问和网络等功能 。
- JavaScript 库提供了函数和工具,便于使用 JavaScript 代码调用 C++ 特性 。
LibuvLibuv[2] 是一个跨平台的开源库,用 C 语言编写 。在 Node.js 运行时中 , 它的作用是提供处理异步操作的支持 。我们来看一下它是如何工作的 。
Node.js 运行时中的代码执行

文章插图
图片
让我们来概括一下代码在 Node 运行时中的执行方式 。在执行代码时,位于图片左侧的 V8 引擎负责 JavaScript 代码的执行 。该引擎包含一个内存堆(Memory heap)和一个调用栈(Call stack) 。
每当声明变量或函数时,都会在堆上分配内存 。执行代码时,函数就会被推入调用栈中 。当函数返回时,它就从调用栈中弹出了 。这是对栈数据结构的简单实现,最后添加的项是第一个被移除 。在图片右侧,是负责处理异步方法的 libuv 。
每当我们执行异步方法时,libuv 接管任务的执行 。然后使用操作系统本地异步机制运行任务 。如果本地机制不可用或不足,则利用其线程池来运行任务,并确保主线程不被阻塞 。
同步代码执行首先,让我们来看一下同步代码执行 。以下代码由三个控制台日志语句组成,依次记录“First”,“Second”和“Third” 。我们按照运行时执行顺序来查看代码 。
推荐阅读
- 人均gdp怎么理解 人均GDP的通俗解释
- 补ac是什么意思,电瓶车充电器中的AC和AC是什么意思
- cdr要如何才能打开图片,cdr如何提取图片中的图案
- 自然语言处理中的句法分析方法研究与实现
- C++的面向对象编程:深入解析与理解
- 天龙八部炼玉怎么弄,天龙八部2中的炼玉有什么用
- 盘点《繁花》中的跨界演员,认出了范志毅、黄玲,没认出谢晖前妻
- 当“关系户”混进年代剧,《繁花》中的败笔演员,换掉她就好了
- 看唐嫣因《繁花》出圈,理解赵丽颖杨幂为一个配角竞争激烈的苦心
- 四川话勾子 四川话中的沟子是什么意思
