Node.js 动画:事件循环

我们都听说过 JavaScript 和 Node.js 是单线程的,但实际上这意味着什么?

这意味着 JavaScript 一次只能做一件事。例如,我们不能同时对数字进行乘法和求和。我们通常按顺序进行操作。我们先加然后乘,反之亦然。现代计算机速度很快,两个或多个连续任务的结果似乎是同时计算的,但也有例外。

我们都曾尝试从那个缓慢的网站上抓取数据,或者在获得数据库查询结果之前等待超过 30 秒。我们是否想因为数据库查询缓慢而阻止我们的单线程执行更多任务?幸运的是,由于 Libuv,Node.js 不会停止运行其他操作,Libuv 是一个 C++ 库,负责事件循环和异步处理网络请求、DNS 解析、文件系统操作、数据加密等任务。

当 Node.js 处理数据库查询等任务时,幕后会发生什么?我们将按照这段代码逐步探索它。

V8 JavaScript 引擎管理调用堆栈,这是跟踪我们程序的哪一部分正在运行的重要部分。每当我们调用 JavaScript 函数时,它都会被推送到调用堆栈。一旦函数到达其结尾或一条return语句,它就会从堆栈中弹出。

在我们的示例中,代码行 console.log('Starting Node.js') 被添加到调用堆栈并打印 Starting Node.js 到控制台。通过这样做,它到达log函数的末尾并从调用堆栈中删除。

下面这行代码是一个数据库查询。这些任务会立即弹出,因为它们可能需要很长时间。它们被传递给 Libuv,后者在后台异步处理它们。同时,Node.js 可以继续运行其他代码而不会阻塞其单个线程。

将来,Node.js 将知道如何处理查询,因为我们已经将回调函数与处理任务结果或错误的指令相关联。在我们的例子中,它是一个简单的 console.log,但它可能是复杂的业务逻辑或生产应用程序中的数据处理。

当 Libuv 在后台处理查询时,我们的 JavaScript 不会被阻止并且可以继续 console.log(”Before query result”).

查询完成后,其回调将被推送到 I/O 事件队列,以便稍后运行* * 事件循环将队列与调用堆栈连接起来。它检查后者是否为空并移动第一个队列项以供执行。

该代码位于GitHub - fabrilallo/nodejs-visualized

关于事件循环的小测验

尝试找出以下代码在控制台上打印的内容。

结论

事件循环、委托和异步处理机制是 Node.js 处理数千个连接、读/写巨大文件、处理计时器的秘密成分,同时处理我们代码的其他部分。

在文章中,我们看到了 Libuv 的重要作用及其处理大量潜在长时间运行任务的能力。同时,我们了解了事件循环及其作为 I/O 事件队列中异步操作的回调和调用堆栈之间的桥梁/连接器的作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

产品大道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值