Node.js 事件循环简单介绍

1.简介

Node.js 事件循环是 Node.js 运行时环境中的一个核心机制,用于管理异步操作和回调函数的执行顺序。它基于事件驱动模型,通过事件循环来处理和派发事件,以及执行相应的回调函数。

  • Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
  • Node.js 几乎每一个 API 都是支持回调函数的。
  • Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
  • Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.

2.Node.js事件循环流程分析

Node.js 事件循环的主要步骤包括:

  • 执行同步代码:首先,Node.js 会执行当前代码中的同步任务,以及它们所调用的同步函数。
  • 执行异步代码:若有异步操作(例如 I/O 操作或网络请求),Node.js 会将其放入事件队列(Event Queue)中,然后继续执行后续的同步任务。
  • 处理事件队列:当同步任务执行完毕或达到一个阈值时,Node.js 将开始处理事件队列。它会依序取出事件队列中的事件,执行相应的回调函数,并处理可能的新事件。
  • 重复上述步骤:Node.js 会重复执行前述的步骤,直到事件队列为空。

对于每个事件的处理过程,Node.js 会执行以下操作:

  • 执行回调函数:Node.js 会将事件从事件队列中取出,然后执行与该事件相关联的回调函数。
  • 执行可能的同步操作:回调函数的执行过程中,可能会引发新的同步操作,Node.js 会立即执行这些同步操作。
  • 返回控制权:回调函数的执行完毕后,Node.js 将返回控制权给事件循环,继续处理下一个事

总结:
Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)

在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。

在这里插入图片描述
整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

3.时间循环举例说明

Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
 
// 创建事件处理程序
var connectHandler = function connected() {
   console.log('连接成功。');
  
   // 触发 data_received 事件 
   eventEmitter.emit('data_received');
}
 
// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);
 
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
   console.log('数据接收成功。');
});
 
// 触发 connection 事件 
eventEmitter.emit('connection');
console.log("程序执行完毕。");

执行结果:

$ node test_event.js
连接成功。
数据接收成功。
程序执行完毕。

4.Node.js工作解析

当你运行一个 Node 应用程序时,它会经历以下步骤:

  • 初始化:Node.js 在启动应用程序之前进行初始化操作,加载所需的模块和依赖项。
  • 执行顶层代码:Node.js 开始执行应用程序的顶层代码,包括变量声明、函数定义等同步操作。
    下面是一个简单的例子:
const http = require('http');

function onRequest(request, response) {
  response.writeHead(200, { 'Content-Type': 'text/plain' });
  response.write('Hello, World!');
  response.end();
}

const server = http.createServer(onRequest);
server.listen(3000);
console.log('Server is running on port 3000');

在这个例子中,我们通过 http 模块创建了一个 HTTP 服务器,并将其绑定到 3000 端口。当服务器收到请求时,会调用 onRequest 函数处理请求并返回响应。

  • 异步操作和回调函数:Node.js 在执行顶层代码后,处理应用程序中的异步操作。这包括处理网络请求、文件读写、数据库查询等。举个例子,假设我们的应用程序要读取一个文件并将其中的内容打印到控制台:
const fs = require('fs');

fs.readFile('data.txt', 'utf8', function (error, data) {
  if (error) {
    console.error('Error:', error);
    return;
  }
  console.log('File content:', data);
});

在这个例子中,我们使用 fs 模块异步地读取名为 data.txt 的文件。读取操作完成后,调用回调函数来处理读取的文件内容。

  • 事件循环:Node.js 的事件循环在后台运行,不断地检查事件队列,并执行相应的回调函数。
    如果我们将上述的 HTTP 服务器和文件读取的例子结合起来:
const http = require('http');
const fs = require('fs');

function onRequest(request, response) {
  fs.readFile('data.txt', 'utf8', function (error, data) {
    if (error) {
      response.writeHead(500, { 'Content-Type': 'text/plain' });
      response.write('Internal Server Error');
      response.end();
      return;
    }
    response.writeHead(200, { 'Content-Type': 'text/plain' });
    response.write(data);
    response.end();
  });
}

const server = http.createServer(onRequest);
server.listen(3000);
console.log('Server is running on port 3000');

现在,当收到 HTTP 请求时,服务器会异步地读取文件,并在读取完成后发送文件内容作为响应。

  • 关闭应用程序:当应用程序终止或手动关闭时,Node.js 会执行一些清理操作并释放资源。
    上述例子中的应用程序可以通过按下 Ctrl+C 组合键来关闭。
    Node.js 的运行方式使它适用于处理高并发和实时应用程序,因为它能够以非阻塞的方式处理异步操作,提供高性能和可伸缩性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/239545.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring boot注解

1.RestController RestController 注解用于标识一个类,表示该类的所有方法都返回JSON或XML响应,而不是视图页面。它是Controller和ResponseBody的组合 2.RequestMapping RequestMapping 注解用于映射HTTP请求到控制器方法或类。它可以用于类级别和方法级别,用于定…

制造业CRM选型指南:功能、价格与适用性

点击输入图片描述(最多30字) 在产业升级的大背景下,传统制造业数字化转型迫在眉睫。然而,生产制造业在转型过程中难免遇到难题,这时候就需要CRM客户管理系统的帮助。本文就将为您介绍,什么是制造业CRM&…

BearPi Std 板从入门到放弃 - 先天神魂篇(2)(RT-Thread LED PWM驱动)

简介 基于 BearPi Std 板从入门到放弃 - 先天神魂篇(1)(RT-Thread 指令点亮LED) 创建的项目, 添加PWM驱动LED的方式实现呼吸灯功能, 电路板及相关使用到的配件说明 开发板 : Bearpi Std(小熊派标准板) 主芯片: STM32L431RCT6 E53_ST1扩展板/…

buuctf-Misc 题目解答分解82-84

82.从娃娃抓起 汉字编码 有两种一种是GB2312 另一种是五笔输入 带数字的是电报码 电报码在线翻译(国际摩尔斯电码及中文电码) - 千千秀字 解密是人工智能 汉字五笔编码批量查询:86版五笔编码、98版五笔编码、18030版五笔编码;五…

智慧文旅云平台建设方案:PPT全文30页,附下载

关键词:智慧文旅解决方案,智慧文旅建设方案,智慧文旅仓,智慧旅游景区方案,智慧旅游服务平台,智慧旅游技术应用,智慧旅游典型案例 一、智慧文旅云平台建设背景 1、旅游消费升级:随着…

文件搜索项目演示

演示功能搜索功能1:根据文件名搜索2:根据文件路径搜索3:根据文件名拼音(全拼、首拼)搜索 选择更新目录功能自动初始化和定时更新功能程序文件项目知识介绍 演示功能 搜索功能 1:根据文件名搜索 2:根据文件路径搜索 3…

【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

【项目资源下载】 本篇配套直接打开可用的项目包地址,欢迎下载: https://download.csdn.net/download/weixin_41697242/88612084 【背景】 想要在Unity中实现实时远程桌面,找到了Render Streaming这个手段,本篇介绍相应的使用方…

Nginx实际问题解决——如何指定地址访问指定页面

Nginx实际问题解决——如何指定地址访问指定页面 问题复现 /var/www/dist/biographicalNotes/下面有一个Html文件 biographicalNotes.html,我实际的nginx代理是这样的 server {listen 8080;server_name localhost;root /var/www/dist;index index.html;location / {try_files…

使用Emscripten开发网页应用的注意事项

一.小心int64 导出C/C函数包含int64 WebAssembly原生(c/c)支持int64位整型数算术运算。 JavaScript只有一种数值类型:number——等同于C语言中的double,JavaScript本质上无法直接表达64位整型数,因此目前的WebAssem…

C++模板类的介绍

C模板类的介绍 C模板类是一种通用编程技术,允许程序员创建可处理多种数据类型的通用类。通过使用模板,我们可以编写一段能够处理不同类型数据的代码,而无需为每一种数据类型单独编写特定的代码。这大大增强了代码的复用性和灵活性。 基本概念…

飞天使-linux操作的一些技巧与知识点2-TCP的三次握手以及四次挥手以及转换状态

文章目录 TCP 的三次握手四次挥手转换状态 TCP 的三次握手 第一次,客户端与服务端建立链接,需要发送请求连接的消息 第二次,服务端接口到数据后,返回一个确认的操作*(至此客户端和服务端链路建立成功) 第三…

binlog+mysqldump恢复数据(误删数据库或者表)

表删除恢复 1、准备数据 首先准备数据库环境,测试数据库为speech1,如下: 为test数据表添加3条记录,如下:三行为新加的记录,添加后将test表删除。 2、恢复数据 查看binlog日志状态 SHOW MASTER STATUS…

汽车服务行业分析:预计2028年将达到38亿元

在推进加快检验机构建设同时,综合评估检验机构数量、分布和检测能力,探索试点汽车 4S 店开展检验,提供维修、保养、车检一体化服务。汽车服务主要是指围绕汽车展开的一系列服务活动,包括维修、美容、金融等,除具有一般…

c/c++ 结构体、联合体、枚举

结构体 结构体内存对齐规则: 1、结构体的第一个成员对齐到结构体变量起始位置偏移量为0的地址处 2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数:编译器默认的一个对齐数与该成员变量大小的较小值。 vs 中…

【STM32】电机驱动

一、电机分类 二、直流电机的分类 1.有刷电机 2.无刷电机 3.直流减速电机 三、H桥电路 正向旋转 驱动Q1和Q4 反向旋转 驱动Q2和Q3 四、MC3386电机驱动芯片 1.基本原理图 1)前进/后退:IN1和IN2的电平顺序决定电机的正反转 2)调节速度&#…

设计未泄密,图纸有守护者——迅软DSE加密软件专题解析!

为何使用图纸加密软件? 对于许多设计单位(如:建筑设计、鞋服设计、勘察测绘、平面设计等)而言,其内部海量的设计图纸都是以电子文件的形式存在于终端电脑和服务器上。而在图纸的设计生产过程中,一般会经过…

【ArcGIS微课1000例】0079:ArcGIS Earth根据经纬坐标生成点shapefile

本文以气象台站数据的生成为例,详细介绍ArcGIS Earth中导入X、Y经纬度坐标,生成Shapefile点数据的流程。 文章目录 一、气象台站分布二、添加经纬度坐标三、符号化设置四、另存为一、气象台站分布 根据气象台站的经纬度坐标,可以很方便的在各种GIS平台上生成点,并保存为多…

Python从入门到精通七:Python函数进阶

函数多返回值 学习目标: 知道函数如何返回多个返回值 问: 如果一个函数如些两个return (如下所示),程序如何执行? 答:只执行了第一个return,原因是因为return可以退出当前函数,导致return下方的代码不执…

如何通过上下滑动实现亮度和音量调节(ArkUI)

场景说明 在音视频应用中通常可以通过上下滑动来调节屏幕亮度和音量大小,本例即为大家介绍如何实现上述UI效果。 说明: 由于当前亮度和音量调节功能仅对系统应用开发,所以本例仅讲解UI效果的实现。 效果呈现 本例效果如下: 当在…

Apollo入门与工作原理Apollo与Nacos的区别

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…
最新文章