美文网首页
了解Node.js事件循环阶段及其执行JavaScript代码的

了解Node.js事件循环阶段及其执行JavaScript代码的

作者: 国外课栈 | 来源:发表于2020-02-15 16:32 被阅读0次

我相信,如果您正在阅读本文,那么您一定已经听说了Node.js拥有著名的事件循环,它如何处理Node.js中的并发机制,以及它如何使Node.js成为事件驱动I / O的独特平台。 作为事件驱动的I / O,执行的所有代码都是回调形式。 因此,重要的是要知道事件循环如何以及以何种顺序执行所有这些回调。 从这里开始,在此文章中,术语“事件循环”是指Node.js的事件循环。

从本质上讲,事件循环是一种在某些阶段进行迭代的机制。您还必须听说过一个称为“事件循环迭代”的术语,该术语表示事件循环在其所有阶段的迭代。

在本文中,我将向您展示事件循环的低级体系结构,其所有阶段是什么,在哪个阶段中执行哪个代码以及一些细节和最后一些示例,我认为它们将使您更好地理解 关于事件循环的概念。

以下是事件循环按照其顺序迭代的所有阶段的图表:

因此,事件循环是Node.js中的一种机制,它在一系列in循环中进行迭代。以下是事件循环迭代的各个阶段:

每个阶段都有一个队列/堆,事件循环使用该队列/堆来推送/存储要执行的回调(Node.js中存在一个误解,即只有一个全局队列,在该全局队列中,回调要排队执行。 是不正确的。)。

计时器:

JavaScript中的计时器回调(setTimeout,setInterval)保留在堆内存中,直到过期为止。 如果堆中有任何过期的计时器,则事件循环将使用与它们关联的回调,并以其延迟的升序开始执行它们,直到计时器队列为空。 但是,计时器回调的执行由事件循环的Poll阶段控制(我们将在本文后面看到)。

待处理的回调:

在此阶段,事件循环执行与系统相关的回调(如果有)。 例如,假设您正在编写节点服务器,而其他进程正在使用您要运行该进程的端口,则该节点将抛出错误ECONNREFUSED,* nix的某些系统可能由于操作系统正在处理的其他任务而希望回调等待执行。 因此,此类回调将被推送到待处理的回调队列中以执行。

空闲/准备

在此阶段,事件循环不执行任何操作。它空闲,准备进入下一阶段。

轮询

这一阶段使Node.js变得独一无二。在此阶段,事件循环会注意新的异步I / O回调。除setTimeout,setInterval,setImmediate和close回调外,几乎所有回调都将执行。

基本上,事件循环在此阶段执行两件事:

如果轮询阶段队列中已经有排队的回调,它将执行它们,直到所有回调从轮询阶段回调队列中耗尽为止。

如果队列中没有回调,则事件循环将在轮询阶段停留一段时间。现在,这个“一段时间”还取决于以下几点:

如果setImmediate队列中存在要执行的任何回调,则事件循环在轮询阶段不会停留更长时间,而将进入下一个阶段,即Check / setImmediate。 同样,它将开始执行回调,直到Check / setImmediate阶段回调队列为空。

事件循环将从轮询阶段移出的第二种情况是,它知道有过期的计时器,这些计时器的回调正在等待执行。 在这种情况下,事件循环将移至下一阶段,即Check / setImmediate,然后移至Closing回调阶段,并最终从计时器阶段开始其下一次迭代。

Check/setImmediate:在此阶段,事件循环从Check阶段的队列获取回调,并开始一个接一个地执行直到队列为空。 当轮询阶段没有剩余要执行的回调并且轮询阶段变为空闲时,事件循环将进入此阶段。 通常,setImmediate的回调在此阶段执行。

关闭回调:在此阶段,事件循环执行与关闭事件关联的回调,例如socket.on('close',fn)或process.exit()。

除了所有这些,还有一个微任务队列,其中包含与process.nextTick相关的回调,我们将在稍后看到。

详情参阅http://viadean.com/node_event_loop_phase.html

相关文章

网友评论

      本文标题:了解Node.js事件循环阶段及其执行JavaScript代码的

      本文链接:https://www.haomeiwen.com/subject/lrkyfhtx.html