📜  node.js 如何防止阻塞代码?

📅  最后修改于: 2022-05-13 01:56:36.740000             🧑  作者: Mango

node.js 如何防止阻塞代码?

Node.js是一个跨平台的JavaScript运行时环境,有助于执行和实现服务器端程序。假定 Node 通过使用单线程事件循环来防止阻塞代码。在本文中,我们将讨论这个事件循环以及它如何使用回调异步实现函数。

阻塞和非阻塞操作:阻塞操作是指阻塞其他代码执行直到它们完成的代码片段。而非阻塞操作允许执行更多的代码片段,而无需让它们等待并在它们完成时使用回调。

因此,可以说阻塞代码是同步工作的,而非阻塞代码是异步工作的。在讨论非阻塞代码时,我们提出了一个叫做回调的术语。回调是一个函数,当进程完成其执行并希望使用外部函数继续正常执行时调用该函数。

节点和事件循环:现在我们知道了阻塞和非阻塞操作是什么,我们可以讨论节点如何防止阻塞代码。 Node 使用单线程,这意味着一次可以执行一个任务。这是通过使用堆栈来完成的。在从上到下读取代码时,每条指令都被压入堆栈,当执行完成时,它会从堆栈中弹出。现在我们可能会遇到需要较长时间执行的指令/函数,这可能会导致弹出堆栈和执行更多语句的延迟。

所以 Node.js 允许使用Event Loop 。每次遇到这种情况时,导致延迟的进程都会从堆栈中卸载,并且该进程的执行会继续并行执行主代码的进一步执行。因此,该函数的回调被推入任务队列,代码继续异步执行。当进程完成其执行时,回调函数从该进程返回所需的输出并恢复正常执行。

示例:让我们考虑一个演示事件循环如何工作的示例。

index.js


使用以下命令运行index.js文件。

输出:

Geeks
For
Geeks

说明:虽然登录Geeks的指令在登录For的指令之前,但这不是他们在控制台中登录的顺序。当调用setTimeout函数时,会触发等待 3 秒的计时器。但是当函数在调用堆栈中时,这个超时不会发生,而是由 Node API 处理。因此,进一步的指令得到处理,当计时器归零时,将调用回调函数并返回函数的结果。

参考资料: https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/