likes
comments
collection
share

如果使用动画的模式解释Node.js的事件循环,会不会让你更加清晰?

作者站长头像
站长
· 阅读数 20

大家好,这里是梦兽编程。一个分享编程知识和编程经验的Up主,以下是我的B站个人主页。期待你的进入我们一起进步 梦兽编程的个人空间_哔哩哔哩_bilibili

node.js 的事件循环

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

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

我们都试过爬取一个网站的数据发出请求等待结果前需要等待30多秒,或者在获取数据库查询结果前等待的时间。这个时候我们是不是因为查询太慢而阻止单线程执行更多任务?但是幸运的是Node.JS不会停止运行,node.js是基于libuv实现的事件循环。Libuv 是一个负责事件循环和异步处理网络请求、DNS 解析、文件系统操作、数据加密等任务的C++库。

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

如果使用动画的模式解释Node.js的事件循环,会不会让你更加清晰?

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

上面的代码用gif,是这样的。

如果使用动画的模式解释Node.js的事件循环,会不会让你更加清晰?

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

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

如果使用动画的模式解释Node.js的事件循环,会不会让你更加清晰?

虽然 Libuv 在后台处理查询,但我们的 JavaScript 不会被阻止,可以继续使用 .console.log(”Before query result”)

用两个执行图概括一下。

如果使用动画的模式解释Node.js的事件循环,会不会让你更加清晰?

如果使用动画的模式解释Node.js的事件循环,会不会让你更加清晰?

结论

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

在本文中,我们看到了 Libuv 的重要作用及其处理大量潜在长期运行任务的能力。同时,我们介绍了事件循环及其作为 I/O 事件队列中异步操作回调和调用堆栈之间的桥梁/连接器的角色。我们将更详细地探讨事件循环的不同阶段如何处理计时器I/O承诺即时报价的内容请关注我的动态。

转载自:https://juejin.cn/post/7201526458396016700
评论
请登录