Node.js 初探:事件循环、非阻塞 I/O 和异步编程简介

Node.js 是一个基于 Chrome V8 JavaScript 引擎构建的运行时,使得 JavaScript 代码可以在服务器端运行。

事件循环、非阻塞 I/O 和异步编程使 Node.js 在处理并发请求方面表现出优越性能。

事件循环

Nodejs的代码是运行在单线程环境中的,每次只会去处理一件事情。

这一种处理方式,避免了多线程环境的数据同步的问题,大大的提升了处理效率。

所谓事件循环,就是指处理器在一个程序周期中,处理完这个周期的事件之后,会进入下一个事件周期,处理下一个事件周期的事情,这样一个周期一个周期的循环。

事件循环是了解 Node.js 最重要的方面之一。为什么这么重要?

事件循环在 Node.js 中是用于调度异步 I/O 操作的核心机制,它阐明了 Node.js 如何做到异步且具有非阻塞的 I/O。它负责处理事件队列,通过一个无限循环的方式轮询执行队列中的任务。

下面是事件循环的工作过程:

  1. Node.js 启动时初始化事件循环。
  2. 在每次循环中,Node.js 检查是否有待处理的 I/O 事件,如网络请求、文件读写等。
  3. 如果有未处理的 I/O 事件,Node.js 进行处理,并将结果放在相应的回调函数队列中。
  4. 执行事件队列中的回调函数,按照次序逐一调用。
  5. 循环继续回到第 2 步,直至所有任务完成,事件队列为空,或者手动退出。

Deep learning source:

  • Introduction to the event loop in Node.js
  • 彻底搞懂 Node.js 中的事件循环机制
  • Event Loops in NodeJS – Beginner’s Guide to Synchronous and Asynchronous Code

非阻塞 I/O

在 Node.js 中,所有 I/O 操作(包括文件、网络等)都是非阻塞的。这意味着当一个 I/O 请求发生时,Node.js 不会等待其完成,而是继续执行后续的操作. 当 I/O 请求完成后,它会通过回调函数将结果通知 Node.js。

node定位:
再来看nodejs的定位:提供一种简单安全的方法在 JavaScript 中构建高性能和可扩展的网络应用程序。
传统的服务器语言大都是多线程。阻塞式I/O,在用户建立连接时,每个连接都是一个线程,十万个用户建立连接,就有十万个线程,node采用 非阻塞异步I/O,最大的优势就是性能强,同样的服务器性能如果使用node可以比传统服务器语言多容纳100倍的用户,(I/O操作越多,node的优势越明显),擅长I/O密集型任务,可以使用在一些I/O密集型的高并发场景中。所以node的定位也选择非阻塞异步I/O也更加适合

作者:十九万里
链接:https://juejin.cn/post/7231835495557578810
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这种方式有以下优点:

  • 提高并发性能,可以同时处理大量请求。
  • 节省资源,避免阻塞进程。
  • 适用于高并发的 I/O 密集型应用。
  • 例如,以下示例说明了非阻塞 I/O 的工作方式:
const fs = require('fs');

fs.readFile('input.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log("File content: ", data);
});

console.log("Continuing with other operations...");

Deep learning source:

  • nodejs中的异步、非阻塞I/O是如何实现的?
  • 浅析NodeJS非阻塞异步I/O

异步编程

Node.js 的异步编程模型支持以下几种形式:

  • 回调函数 (Callback): 当一个异步任务完成时,执行回调函数. 当多个回调函数嵌套使用时可能导致回调地狱(Callback Hell)。

  • 事件监听 (EventEmitter): 通过事件监听器可以在异步操作时发出和接收不同的事件。

  • Promise: 可以解决回调地狱的问题,提供了一个更简洁的链式处理异步任务的方法。

  • async/await: 是 Promise 的改良,使用 async 和 await 关键字可以让异步操作看起来像同步操作,更容易阅读和理解。

Deep learning source:

  • 深入理解nodejs中的异步编程
  • 深入理解Node.js异步编程

通过这三个核心组件,Node.js 在高并发场景下获得了卓越性能,成为构建服务器端应用的理想解决方案。

你可能感兴趣的:(Nodejs,学习笔记,node.js,javascript)