译者|LuXinwang当我们启动一个Node.js应用程序时,它会加载事件循环并将必要的回调函数添加到回调堆栈中。在本文中,您将了解有关事件循环如何在Node.js中工作的更多信息。一、为什么要理解Node.js中的事件循环以下几点解释了为什么理解事件循环很重要:理解事件循环的原理将帮助你编写更高效的代码。调试代码更容易2.根据官方Node.js的说法,什么是事件循环?将操作卸载到系统内核中。我们可以把这个定义分解成三个关键词:非阻塞I/O操作单线程系统内核1.非阻塞I/O操作如果一个操作的执行没有被阻塞,我们就说这个程序是非阻塞的。既然这里提到了非阻塞,那我们也应该提到什么是阻塞。这只是意味着您必须等到一个操作完成后再进行另一个操作。2.单线程如果一个程序只有一个调用栈,并且采用先进先出的概念,同时只能执行一个任务,那么这个程序就是单线程的。这意味着堆栈中的第一个程序将始终在下一个程序之前运行。尽管JavaScript看起来是一种单线程语言,但它只取决于它运行的环境。3.系统内核在这里,内核只是指运行程序的操作系统。Javascript是单线程的,但Node.js可以在不阻塞线程的情况下执行多个输入输出(I/O)操作。它通过尽可能地将此操作卸载到操作系统(例如Linux、Windows、MacOSX等)来实现这一点。操作大部分卸载到操作系统中;这就是Javascript与Node.js的不同之处。3.Node.js中的事件循环是如何工作的当我们启动节点应用程序时,事件循环立即开始运行。事件循环有多个阶段,每个阶段都有一个要执行的回调队列。当一个事件循环被添加到一个特定的阶段时,它会在那个特定的阶段执行一些操作,然后在那个阶段的队列中执行一些回调。这将一直持续到队列为空或已执行最大数量的回调函数。当达到限制时,事件循环进入下一阶段做同样的事情。最重要的阶段有四个:过期时间回调I/O轮询和回调setImmediate回调关闭回调1.过期时间回调这个阶段负责处理过期定时器的回调函数。示例:setTimeout(()=>console.log('expiredtimers'),1000)是一个设置定时器的函数,该定时器在一定时间后到期。因此,如果这个计时器有回调函数,那么它们将是事件循环处理的第一个函数。如果定时器稍后到期,在处理其他阶段所需的时间内,只有当事件循环返回到第一阶段时才会调用定时器的回调。它在所有四个阶段都是这样工作的。2.I/OPolling和CallbackPolling基本上就是寻找新的准备好处理的I/O事件并将它们放入回调队列中。了解在Node应用程序的上下文中,I/O仅指网络和文件访问之类的事情是至关重要的。例子:fs.readFile('file.txt',(e,d))=>console.log('Fileread')})在这个阶段,99%的代码都会被执行,因为在典型的Node应用中在,我们需要做的大部分工作都与网络和读取文件有关。3.setImmediatecallback如果我们想在轮询和执行阶段的I/O之后立即处理回调,我们使用这个特殊的定时器。这在一些更高级的情况下可能很重要。setImmediate(()=>setImmediate(()=>console.log('immediate');});4.关闭回调在这个阶段,所有的关闭事件都会被处理,例如,当一个web服务器关闭时。完成了事件循环的第四阶段。注意:Node.js事件循环内部还使用了其他事件,但是对于本文而言,以上四个事件对我们来说至关重要。如上所述,我们完成了这个过程,它只是事件循环中的一个循环。循环结束后,Node.js决定是继续循环还是退出循环。Node只是检查是否有任何任务(如定时器或I/0任务)仍然存在在后台运行做这个。如果没有,它退出应用程序。如果有待处理的任务,它们会继续执行下一个任务,例如处理HTTP请求或读取文件。这就是Node事件循环的基本内容全部关于4.避免阻塞事件循环因为Node.js中的所有内容最终都在单个线程中运行,您可以让数百万用户访问s同时使用相同的池,这使得Nde.js非常轻量级和可扩展性。但同时,它也有阻塞单个线程的风险,这会拖慢整个应用程序,甚至停止应用程序。5.避免阻塞事件循环的一些准则作为开发人员,避免阻塞事件循环是你的责任。以下指南可以帮助您避免阻塞事件循环。不要在回调函数的fs、crypto和Zlib模块中使用同步版本的函数。在处理较大的对象时使用JSON时要小心。不要使用过于复杂的正则表达式(例如嵌套量词)。不要对嵌套对象执行复杂的计算。6.关于Node.js事件循环的最终想法事件循环使Node.js中的异步编程成为可能。这使它成为Node.js设计中最重要的特性。这使得Node.js与其他平台完全不同。它负责处理所有传入事件并通过将较重的任务卸载到线程池并自行完成最简单的工作来执行编排。原文链接:https://hackernoon.com/how-do-event-loops-in-nodejs-work译者介绍卢新望,社区编辑,编程语言爱好者,对数据库、架构、云原生有着浓厚的兴趣。
