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

node.js 的事件循环

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

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

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

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

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

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

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

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

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

用两个执行图概括一下。