一文搞懂Node的的事件循环

Node的事件循环到底是什么?

如果你在学习Node.js,你一定听过事件循环,但你可能不理解这个它到底是什么。在本文中,我们将会谈一下关于事件循环及其在Node.js中的作用。

了解Node.js的事件循环机制

Node.js中的时间循环机制负责处理程序中所有的事件。这个事件循环是在单个线程上执行的,然而由于它的所有操作都是异步执行的,它可以处理多个请求。

为了理解这个过程,首先需要了解事件循环机制中的几个基本术语:

事件 (Event)

在事件循环中,任何可以发出一个或多个操作请求的事件或者操作都叫做事件。这些事件通常包括来自网络、I/O、定时器等。例如,当用户单击按钮或者提交表单时,这些操作都可以被看作是事件。

回调函数 (Callback)

回调函数是一个异步函数,它会在事件被触发后执行。在Node.js中,回调函数通常是一个参数传递到另外一个函数中去的。当一个事件触发时,Node.js会执行相应的回调函数。

任务队列 (Task Queue)

任务队列是一个队列数据结构,用于对回调函数进行排列。在事件循环中,当一个异步操作结束后,回调函数会被添加到任务队列中等待执行。

现在,我们已经了解了事件循环的基本术语,下面将会详细说明Node.js中的事件循环机制。

Node.js的事件循环机制

在Node.js中,事件循环由几个不同的阶段组成。每个阶段都执行不同的操作。以下是Node.js中的事件循环机制:

Timers 阶段

这个阶段处理定时器的回调函数。在这个阶段,所有到期的setTimeout()和setInterval()会被执行。这个阶段通常是事件循环的第一步。

// 延迟2秒

console.log('延迟2秒');

setTimeout(() => {

console.log('2秒已过!!!');

}, 2000);

在上面的代码中,setTimeout需要2秒才能被执行。

I/O Callbacks 阶段

这个阶段被用于执行被延迟的I/O操作的回调函数,例如网络和文件I/O。所有达到操作的回调函数将被放入任务队列并在下一个阶段中执行。

Idle, Prepare 阶段

这个阶段是设计为内部使用的。

Poll 阶段

这是在事件发生时等待新的I/O事件的阶段,也是事件循环的关键。在该阶段,Node.js将执行以下操作:

如果任务队列不为空,事件循环将会遍历任务队列并执行所有的回调函数。

如果任务队列为空,它将会等待新的任务并一直等下去。

如果正在等待I/O事件,则等待该事件。

Check 阶段

这个阶段用于执行setImmediate()的回调函数。

// setImmediate()回调函数

console.log('要发生在下一个事件循环周期的操作');

setImmediate(() => {

console.log('我是setImmediate()的回调函数');

});

在上面的代码中,我们看到了使用setImmediate()函数调用的回调函数。该函数被添加到任务队列中,并在下一个事件循环中执行。

Close Callbacks 阶段

这个阶段被用于执行close事件的回调函数,例如socket.on('close', ...)

下面是一个简单的示例程序,将演示事件循环的工作原理:

console.log('主线程开始');

// 延迟2秒

console.log('延迟2秒');

setTimeout(() => {

console.log('2秒已过!!!');

}, 2000);

console.log('主线程继续执行');

在console输出中,你会看到以下结果:

主线程开始

延迟2秒

主线程继续执行

2秒已过!!!

在上面的示例中,setTimeout()函数不会阻塞程序的执行。Node.js将延迟计时器的回调函数添加到事件循环的任务队列中,并继续执行程序。当2秒时间到期后,延迟计时器的回调函数被添加到事件循环的队列中,而不是直接执行它。

总结

在Node.js中,事件循环机制是处理异步任务的关键。事件循环由不同的阶段组成,每个阶段都执行不同的操作。了解这些基本概念如何在Node.js中运作,将有助于我们更好地理解异步编程和Node.js的内部工作原理。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。