node.js之---事件循环机制

news2025/1/7 14:51:40

事件循环机制

Node.js 事件循环机制(Event Loop)是其核心特性之一,它使得 Node.js 能够高效地处理大量并发的 I/O 操作。Node.js 基于 非阻塞 I/O,使用事件驱动的模型来实现异步编程。事件循环是 Node.js 实现异步编程的基础,它帮助 Node.js 在单线程中处理多个并发操作,同时避免了传统多线程模型中的性能开销。

事件循环的基本概念

Node.js 是单线程的,这意味着它的 JavaScript 代码是同步执行的。但是,Node.js 利用事件循环和异步 I/O 操作,使得可以在不阻塞主线程的情况下处理并发请求。事件循环是一个不断轮询的机制,它负责调度和执行异步操作。

事件循环的主要工作是:

  • 监听事件(如文件 I/O、网络请求等)
  • 处理回调函数
  • 维护事件队列

每当有异步操作(如数据库查询、文件读写、HTTP 请求等)完成时,事件循环会将相应的回调函数推送到事件队列中,事件循环则会依次执行这些回调函数。

事件循环的执行流程

Node.js 中的事件循环实际上是通过一系列阶段来执行的,每个阶段执行特定类型的回调。事件循环的阶段如下:

  1. Timers 阶段

    • 在这个阶段,事件循环会检查是否有定时器(如 setTimeout 和 setInterval)到期。如果到期,它会执行相应的回调函数。
  2. I/O Callbacks 阶段

    • 执行几乎所有的回调函数,除了定时器回调和 setImmediate() 回调。这个阶段处理的是系统的异步 I/O 操作,如文件系统操作、网络请求等。
  3. Idle, Prepare 阶段

    • 这是一个准备阶段,主要用于内部操作,开发者通常不会直接操作该阶段。
  4. Poll 阶段

    • 这是事件循环的核心阶段,负责查询事件队列。事件循环会在这个阶段等待事件队列中有待处理的事件。如果队列中有回调函数,它会执行这些回调。如果队列为空,则会继续等待事件。
  5. Check 阶段

    • 执行 setImmediate() 注册的回调函数。setImmediate() 是一种立即执行的机制,在事件循环的 "Check" 阶段执行。注意,setImmediate() 和 setTimeout() 具有不同的执行时机,setTimeout() 是基于时间延迟来调度回调,而 setImmediate() 则在当前事件循环周期中立即执行。
  6. Close Callbacks 阶段

    • 处理某些关闭回调,如 socket.on('close', callback) 或 fs.close() 的回调。

事件循环的生命周期

  1. 同步代码执行

    • 当 Node.js 应用启动时,主线程首先执行所有的同步代码。如果代码中存在 I/O 操作,它会被异步化,交由事件循环管理。
  2. 事件循环开始

    • 一旦同步代码执行完毕,事件循环开始运转,开始处理事件队列中的任务。
  3. 阶段执行

    • 事件循环按顺序执行上述的每个阶段。每个阶段的任务执行完成后,进入下一个阶段,直到所有回调函数都被执行完毕。
  4. 空闲和结束

    • 如果事件循环没有更多的任务要处理,它将进入空闲状态,直到下一次有事件到来。

分析以下代码的打印顺序

setTimeout(() => {
  console.log('5----------'); 
}, 10);

setImmediate(() => {
  console.log('3----------'); 
});

console.log('1----------'); 

setTimeout(() => {
  console.log('6----------'); 
}, 10);

setImmediate(() => {
  console.log('4----------');
});

console.log('2----------');

在node环境中的打印顺序

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 Ubuntu 22.04 上部署 Nginx 并优化以应对高流量网站教程

简介 本教程将教你如何优化 Nginx,使其能够高效地处理高流量网站。 Nginx 是一个强大且高性能的 Web 服务器,以其高效处理大量并发连接的能力而闻名,这使得它成为高流量网站的流行选择。 正确优化 Nginx 可以显著提高服务器的性能&#xff0…

AIRemoveBackground:用 AI 技术轻松去除背景图的前端程序

在当今数字化时代,图像处理技术不断发展,其中 AI 去除背景图的功能备受关注。本文将介绍一款名为 AIRemoveBackground 的前端程序,它利用人工智能技术,为用户提供便捷、高效的背景去除解决方案。 一、简介 随着互联网的普及和多媒…

【踩坑指南2.0 2025最新】Scala中如何在命令行传入参数以运行主函数

这个地方基本没有任何文档记录,在学习的过程中屡屡碰壁,因此记录一下这部分的内容,懒得看可以直接跳到总结看结论。 踩坑步骤 首先来看看书上让我们怎么写: //main.scala object Start {def main(args:Array[String]) {try {v…

Excel VBA 自动填充空白并合并相同值的解决方案

文章目录 Excel VBA: 自动填充空白并合并相同值的解决方案问题背景解决方案1. VBA代码实现2. 代码说明3. 使用方法4. 注意事项 扩展优化总结 Excel VBA: 自动填充空白并合并相同值的解决方案 问题背景 在Excel中经常会遇到这样的数据处理需求:一列数据中存在多个空…

SpringSecurity中的过滤器链与自定义过滤器

关于 Spring Security 框架中的过滤器的使用方法,系列文章: 《SpringSecurity中的过滤器链与自定义过滤器》 《SpringSecurity使用过滤器实现图形验证码》 1、Spring Security 中的过滤器链 Spring Security 中的过滤器链(Filter Chain)是一个核心的概念,它定义了一系列过…

【STC库函数】Compare比较器的使用

如果我们需要比较两个点的电压,当A点高于B点的时候我们做一个操作,当B点高于A点的时候做另一个操作。 我们除了加一个运放或者比较器,还可以直接使用STC内部的一个比较器。 正极输入端可以是P37、P50、P51,或者从ADC的十六个通道…

Postgresql 命令还原数据库

因为PgAdmin打不开,但是数据库已经安装成功了,这里借助Pg命令来还原数据库 C:\Program Files\PostgreSQL\15\bin\psql.exe #链接数据库 psql -U postgres -p 5432#创建数据库 CREATE DATABASE "数据库名称"WITHOWNER postgresENCODING UTF8…

Backend - C# 的日志 NLog日志

目录 一、注入依赖和使用 logger 二、配置记录文件 1.安装插件 NLog 2.创建 nlog.config 配置文件 3. Programs配置日志信息 4. 设置 appsettings.json 的 LogLevel 5. 日志设定文件和日志级别的优先级 (1)常见的日志级别优先级 (2&…

急需升级,D-Link 路由器漏洞被僵尸网络广泛用于 DDoS 攻击

僵尸网络活动增加 :新的“FICORA”和“CAPSAICIN”僵尸网络(Mirai 和 Kaiten 的变体)的活动激增。 被利用的漏洞 :攻击者利用已知的 D-Link 路由器漏洞(例如 CVE-2015-2051、CVE-2024-33112)来执行恶意命…

[ubuntu-22.04]ubuntu不识别rtl8153 usb转网口

问题描述 ubuntu22.04插入rtl8153 usb转网口不识别 解决方案 安装依赖包 sudo apt-get install libelf-dev build-essential linux-headers-uname -r sudo apt-get install gcc-12 下载源码 Realtek USB FE / GBE / 2.5G / 5G Ethernet Family Controller Softwarehttps:/…

WinForm开发-自定义组件-1. 工具栏: UcompToolStrip

这里写自定义目录标题 1. 工具栏: UcompToolStrip1.1 展示效果1.2 代码UcompToolStrip.csUcompToolStrip.Designer.cs 1. 工具栏: UcompToolStrip 自定义一些Winform组件 1.1 展示效果 1)使用效果 2)控件事件 1.2 代码 设计 编码 UcompToolStrip.…

Hypium纯血鸿蒙系统 HarmonyOS NEXT自动化测试框架

1、什么是Hypium Hypium是华为官方为鸿蒙操作系统开发的一款以python为语言的自动化测试框架。 引用华为官网介绍如下: DevEco Testing Hypium(以下简称Hypium)是HarmonyOS平台的UI自动化测试框架,支持开发者使用python语言为应用编写UI自动化测试脚本…

基于Spring Boot微信小程序电影管理系统

一、系统背景与意义 随着移动互联网的普及和用户对个性化娱乐需求的不断增长,电影行业迎来了新的发展机遇。然而,传统的电影管理方式存在信息不对称、购票流程繁琐、用户体验不佳等问题。因此,开发一个基于Spring Boot微信小程序的电影管理系…

软件工程实验-实验2 结构化分析与设计-总体设计和数据库设计

一、实验内容 1. 绘制工资支付系统的功能结构图和数据库 在系统设计阶段,要设计软件体系结构,即是确定软件系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。同时把模块组织成良好的层次系统:顶层模块通过调用它的下层…

深度学习blog- 数学基础(全是数学)

矩阵‌:矩阵是一个二维数组,通常由行和列组成,每个元素可以通过行索引和列索引进行访问。 张量‌:张量是一个多维数组的抽象概念,可以具有任意数量的维度。除了标量(0D张量)、向量(…

JMH338-剑侠情缘2【开服端】-2017版【剑荡三界】+服务端+客户端+登录器+外网

资源介绍: 激情服;剑荡三界基本上可以直接开服玩,总之每个服都有他的特色;云中,红莲山,葬雪城三大地图三种世界BOSS每个小时刷一次 云中押镖劫镖,出城就是PK模式 剑荡烟云副本分为普通和难度…

QML自定义滑动条Slider的样式

代码展示 import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Controls 2.1Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Slider {id: controlvalue: 0.5background: Rectangle {x: control.leftPaddingy: control.topPadding …

什么是.net framework,什么是.net core,什么是.net5~8,版本对应关系

我不知道有多少人和我一样,没学习过.netCore,想要学习,但是版本号太多就蒙了,不知道学什么了,这里解释下各个版本的关系 我们一般开始学习微软的时候,都是开始学习的.netframework,常用的就是4…

【2025最新计算机毕业设计】基于Spring Boot+Vue影院购票系统(高质量源码,提供文档,免费部署到本地)

作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

matlab中高精度计算函数vpa与非厄米矩阵本征值的求解

clear;clc;close all tic %并行设置% delete(gcp(nocreate));%关闭之前的并行 cparcluster(local); c.NumWorkers50;%手动设置线程数(否则默认最大线程为12) parpool(c, c.NumWorkers); %并行设置%w1; u2.5;N30;valstozeros(2*N2,100); v10linspace(-3,3,100).;parfor jj1:leng…