当前位置: 首页 > news >正文

C#异步和多线程,Thread,Task和async/await关键字--12

目录

一.多线程和异步的区别

1.多线程

2.异步编程

多线程和异步的区别

二.Thread,Task和async/await关键字的区别

1.Thread

2.Task

3.async/await

三.Thread,Task和async/await关键字的详细对比

1.Thread和Task的详细对比

2.Task 与 async/await 的配合使用

3. async/await 的实际应用场景

4.关键区别总结


引言:在 C# 编程中,多线程和异步编程都是用于提高应用程序性能和响应性的技术,但它们的用途和实现方式有所不同

一.多线程和异步的区别

1.多线程

定义:

  • 多线程是指在一个应用程序中同时运行多个线程,每个线程都独立执行代码.这些线程可能在多个处理器核心上并行运行,也可能在单个核心上通过时间片轮转方式运行

特性:

  • 并行执行:多个线程可以并行执行任务,提高 CPU 利用率,适用于 CPU 密集型任务
  • 共享内存空间:同一进程中的线程共享内存空间,可以方便地共享数据,但也需要处理同步问题
  • 线程管理:需要开发者手动管理线程的创建,启动,同步和销毁

使用场景:

  • 需要并行处理多个 CPU 密集型任务,以充分利用多核 CPU 的能力
  • 需要在后台执行复杂计算,同时保持应用程序的响应性

2.异步编程

定义:

  • 异步编程是一种编程范式,允许程序在等待长时间运行的操作(如 I/O、网络请求)完成时,不阻塞当前线程,从而提高应用程序的响应性和效率

特性:

  • 非阻塞:异步操作不会阻塞线程,当前线程可以继续执行其他任务
  • 事件驱动:通过回调,事件或任务的方式在操作完成时通知应用程序
  • 适用于 I/O 密集型任务:特别是磁盘,网络等 I/O 操作,这些操作等待时间长,CPU 利用率低

使用场景:

  • 防止界面卡顿:在 GUI 应用程序中,防止长时间的操作阻塞 UI 线程,保持界面响应性
  • 服务器高并发:在服务器应用中,异步操作可以处理大量并发 I/O 请求,提高吞吐量

多线程和异步的区别

// 多线程示例
public void ThreadMethod()
{// 创建新线程Thread thread = new Thread(() =>{// 这段代码在新线程上运行DoSomeWork();});thread.Start();
}// 异步示例
public async Task AsyncMethod()
{// 不会创建新线程,而是在当前线程上异步执行await Task.Run(() =>{DoSomeWork();});
}
  • 目的不同:多线程主要用于并行执行 CPU 密集型任务,异步编程主要用于非阻塞地执行 I/O 密集型任务
  • 实现方式:多线程通过创建和管理线程实现并行,异步编程通过非阻塞的操作和回调机制实现,不一定需要多线程
  • 资源利用:多线程可能会创建大量线程,占用系统资源;异步编程通常使用回调或任务,不需要额外的线程
    // 多线程示例 - CPU密集型计算
    public void ThreadExample()
    {Thread calculateThread = new Thread(() =>{// 复杂计算for (int i = 0; i < 1000000; i++){// 进行大量计算}});calculateThread.Start();
    }// 异步示例 - I/O操作
    public async Task AsyncExample()
    {// 读取文件string content = await File.ReadAllTextAsync("file.txt");// 发送网络请求var response = await httpClient.GetAsync("http://api.example.com");
    }
    

二.Thread,Task和async/await关键字的区别

1.Thread

定义:

  • System.Threading.Thread 类表示 .NET 中的一个线程,可以用来手动创建,控制和管理线程

特性:

  • 直接映射到操作系统线程:每个 Thread 实例对应一个操作系统线程
  • 手动管理:需要手动创建,启动和销毁线程,以及处理线程同步问题
  • 开销较大:创建和销毁线程的开销较大,过多的线程可能导致系统性能下降

使用场景:

  • 需要对线程有精细的控制,比如设置线程优先级,堆栈大小,文化信息等
  • 特定场景下需要手动管理线程的生命周期

示例代码:

    // 创建第一个线程Thread thread1 = new Thread(() =>{for (int i = 0; i < 5; i++){Console.WriteLine($"线程1正在执行: {i}");Thread.Sleep(2000); // 暂停2秒}});// 创建第二个线程Thread thread2 = new Thread(new ThreadStart(Thread2Method));// 启动线程Console.WriteLine("开始执行线程...");thread1.Start();thread2.Start();// 等待线程结束//Join方法用于等待线程结束,即等待线程中的代码执行完毕。thread1.Join();thread2.Join();Console.WriteLine("所有线程执行完毕!");Console.ReadKey();
}// 第二个线程要执行的方法
static void Thread2Method()
{for (int i = 0; i < 5; i++){Console.WriteLine($"线程2正在执行: {i}");Thread.Sleep(800); // 暂停0.8秒}
}

2.Task

定义:

  • System.Threading.Tasks.Task 类代表一个异步操作,可以理解为更高级别的异步编程抽象

特性:

  • 基于任务的异步模式(TAP):使用任务来表示异步操作,可以更方便地组合,链接和处理任务
  • 线程池Task 默认会使用线程池中的线程,而不是创建新的线程,从而减少开销
  • 支持结果值Task<TResult> 可以返回计算结果
  • 与 async/await 协同工作Task 可以与 async/await 关键字配合使用,简化异步编程

使用场景:

  • 执行异步操作,无需手动管理线程。
  • 需要组合多个异步操作,或处理异步操作的结果。
     static async Task Main(string[] args){Console.WriteLine("开始任务示例...");// 1. 基本的异步任务await SimpleTaskAsync();// 2. 带返回值的任务int result = await CalculateAsync();Console.WriteLine($"计算结果: {result}");// 3. 并行任务await ParallelTasksAsync();// 4. 任务超时处理await TaskWithTimeoutAsync();Console.WriteLine("所有任务完成!");Console.ReadKey();}// 基本异步任务static async Task SimpleTaskAsync(){Console.WriteLine("开始简单任务");await Task.Delay(1000); // 模拟耗时操作Console.WriteLine("简单任务完成");}// 带返回值的异步任务static async Task<int> CalculateAsync(){Console.WriteLine("开始计算");await Task.Delay(2000); // 模拟复杂计算return 42;}// 并行任务示例static async Task ParallelTasksAsync(){Console.WriteLine("开始并行任务");var task1 = Task.Run(async () =>{await Task.Delay(1000);Console.WriteLine("任务1完成");});var task2 = Task.Run(async () =>{await Task.Delay(2000);Console.WriteLine("任务2完成");});// 等待所有任务完成await Task.WhenAll(task1, task2);Console.WriteLine("所有并行任务完成");}// 带超时的任务static async Task TaskWithTimeoutAsync(){Console.WriteLine("开始超时任务");try{using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2));await Task.Delay(3000, cts.Token); // 这个任务会超时Console.WriteLine("此行不会执行");}catch (TaskCanceledException){Console.WriteLine("任务已超时");}}

3.async/await

定义:async/await是 C# 中用于简化异步编程的关键字

特性:

  • async 方法:使用 async 修饰的方法表示其内部可能包含异步操作,可以使用 await 关键字
  • await 关键字:用于等待一个异步任务完成,而不会阻塞当前线程
  • 编译器支持:编译器会将 async 方法转换为状态机,处理异步操作的调度

使用场景:

  • 希望以同步的方式编写异步代码,提高代码的可读性和维护性。
  • 在 GUI 或服务器应用中,防止长时间的操作阻塞线程。

三.Thread,Task和async/await关键字的详细对比

1.Thread和Task的详细对比

// Thread 示例
Thread thread = new Thread(() =>
{Console.WriteLine("使用 Thread 执行工作");Thread.Sleep(1000);
});
thread.Start();// Task 示例
Task task = Task.Run(() =>
{Console.WriteLine("使用 Task 执行工作");Thread.Sleep(1000);
});

主要区别:

Thread:

  • 直接映射到操作系统线程
  • 资源开销大
  • 无法直接返回结果
  • 不易于管理和组合

Task:

  • 使用线程池
  • 可以返回结果
  • 支持取消、延续、异常处理
  • 易于组合和管理

2.Task 与 async/await 的配合使用

// Task 单独使用
public Task<int> GetDataAsync()
{return Task.Run(() => {// 执行一些耗时操作Thread.Sleep(1000);return 42;});
}// 使用 async/await
public async Task<int> GetDataAsyncWithAwait()
{Console.WriteLine("开始");await Task.Delay(1000); // 异步等待Console.WriteLine("结束");return 42;
}

3. async/await 的实际应用场景

// 文件操作示例
public async Task SaveFileAsync(string content)
{Console.WriteLine("开始保存文件");await File.WriteAllTextAsync("test.txt", content);Console.WriteLine("文件保存完成");
}// 多个异步操作组合
public async Task ProcessDataAsync()
{try{// 并行执行多个异步操作var task1 = Task.Delay(1000);var task2 = Task.Delay(2000);await Task.WhenAll(task1, task2);// 串行执行异步操作var result1 = await GetDataAsync();var result2 = await ProcessResultAsync(result1);}catch (Exception ex){Console.WriteLine($"错误: {ex.Message}");}
}

4.关键区别总结

1)执行模型:

  • Thread: 一个线程执行一个任务
  • Task: 可以使用线程池,更灵活
  • async/await: 不创建新线程,而是管理异步操作

2)资源使用:

  • Thread: 每个线程占用约1MB内存
  • Task: 更轻量级,共享线程池
  • async/await: 几乎没有额外开销

3)使用场景:

  • Thread: 需要直接控制线程时
  • Task: 执行后台操作,需要返回结果时
  • async/await: IO操作,网络请求等不需要CPU计算的操作

4)代码可维护性:

  • Thread: 较难管理和维护
  • Task: 提供更好的控制和组合
  • async/await: 提供最清晰的代码结构

在实际的开发中优先使用 async/await 处理异步操作,需要并行计算时使用 Task,只在特殊情况下使用 Thread

相关文章:

C#异步和多线程,Thread,Task和async/await关键字--12

目录 一.多线程和异步的区别 1.多线程 2.异步编程 多线程和异步的区别 二.Thread,Task和async/await关键字的区别 1.Thread 2.Task 3.async/await 三.Thread,Task和async/await关键字的详细对比 1.Thread和Task的详细对比 2.Task 与 async/await 的配合使用 3. asy…...

第一次作业三种方式安装mysql(Windows和linux下)作业

在Windows11上安装sever&#xff08;服务&#xff09;端和客户端 server端安装 打开官网MySQL 进入到主页 点击DOWMLOAD 进入下载界面 点击下方MySQL Community (GPL) Downloads 进入社区版mysql下载界面 点击 MySQL Community Server 进入server端下载 选择8.4.3LTS&…...

ubuntu官方软件包网站 字体设置

在https://ubuntu.pkgs.org/22.04/ubuntu-universe-amd64/xl2tpd_1.3.16-1_amd64.deb.html搜索找到需要的软件后&#xff0c;点击&#xff0c;下滑&#xff0c; 即可在Links和Download找到相关链接&#xff0c;下载即可&#xff0c; 但是找不到ros的安装包&#xff0c; 字体设…...

深拷贝与浅拷贝

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…...

No one knows regex better than me

No one knows regex better than me 代码分析&#xff0c;传了两个参数zero,first&#xff0c;然后$second对两个所传的参数进行了拼接 好比&#xff1a;?zero1&first2 传入后就是: 12 然后对$second进行了正则匹配&#xff0c;匹配所传入的参数是否包含字符串Yeedo|wa…...

scala基础学习(数据类型)-集合

文章目录 集合创建集合isEmpty获取数据添加元素删除元素常见方法交集 &差集 diff --并集 unionto stringto listto Arrayto Map其余常用方法 集合 Scala Set(集合)是没有重复的对象集合&#xff0c;所有的元素都是唯一的。 Scala 集合分为可变的和不可变的集合。 默认情…...

如何使用 Excel 进行多元回归分析?

多元回归分析&#xff0c;一种统计方法&#xff0c;用来探索一个因变量&#xff08;即结果变量&#xff09;与多个自变量&#xff08;即预测变量&#xff09;之间的关系。广泛用于预测、趋势分析以及因果关系的分析。 听起来这个方法很复杂&#xff0c;但其实在 Excel 中可以很…...

思维转换:突破思维桎梏,创造更高效的工作与生活

在现代职场和生活中&#xff0c;我们经常面临着各种挑战和问题&#xff0c;有时候虽然付出了很多努力&#xff0c;但依然难以找到更有效的解决方案。这时&#xff0c;或许我们需要的不是更多的努力&#xff0c;而是一次“思维转换”。这一概念看似简单&#xff0c;但它背后却蕴…...

ClickHouse-CPU、内存参数设置

常见配置 1. CPU资源 1、clickhouse服务端的配置在config.xml文件中 config.xml文件是服务端的配置&#xff0c;在config.xml文件中指向users.xml文件&#xff0c;相关的配置信息实际是在users.xml文件中的。大部分的配置信息在users.xml文件中&#xff0c;如果在users.xml文…...

Spring Boot 项目启动后自动加载系统配置的多种实现方式

Spring Boot 项目启动后自动加载系统配置的多种实现方式 在 Spring Boot 项目中&#xff0c;可以通过以下几种方式实现 在项目启动完成后自动加载系统配置缓存操作 的需求&#xff1a; 1. 使用 CommandLineRunner CommandLineRunner 是一个接口&#xff0c;可以用来在 Spring…...

scrapy库解决ja3/tls指纹验证问题

pip install curl_cffi0.7.4 pip install scrapy-fingerprint0.1.3seetings.py打开中间件 DOWNLOADER_MIDDLEWARES { "scrapy_fingerprint.fingerprintmiddlewares.FingerprintMiddleware": 100 }yield scrapy.Request(urlurl,callbackself.parse) 改为以下 from sc…...

二进制、八进制、十进制和十六进制的相互转换

printf 函数 printf 函数是 C 语言中用于将格式化的数据输出到标准输出&#xff08;通常是屏幕&#xff09;的函数。它位于 stdio.h 头文件中&#xff0c;因此在使用之前需要包含该头文件。 printf 函数的格式说明符 格式说明符说明示例%d 或 %i输出或输入十进制有符号整数p…...

分布式缓存redis

分布式缓存redis 1 redis单机&#xff08;单节点&#xff09;部署缺点 &#xff08;1&#xff09;数据丢失问题&#xff1a;redis是内存存储&#xff0c;服务重启可能会丢失数据 &#xff08;2&#xff09;并发能力问题&#xff1a;redis单节点&#xff08;单机&#xff09;部…...

day08_Kafka

文章目录 day08_Kafka课程笔记一、今日课程内容一、消息队列&#xff08;了解&#xff09;**为什么消息队列就像是“数据的快递员”&#xff1f;****实际意义**1、产生背景2、消息队列介绍2.1 常见的消息队列产品2.2 应用场景2.3 消息队列中两种消息模型 二、Kafka的基本介绍1、…...

fbx 环境搭建

python 3.7 3.8 版本支持 https://github.com/Shiiho11/FBX-Python-SDK-for-Python3.x 只有python3.7 https://www.autodesk.com/developer-network/platform-technologies/fbx-sdk-2020-3 scipy安装&#xff1a; python安装scipy_scipy1.2.1库怎么安装-CSDN博客 smpl 2 fbx…...

【大数据】机器学习------神经网络模型

一、神经网络模型 1. 基本概念 神经网络是一种模拟人类大脑神经元结构的计算模型&#xff0c;由多个神经元&#xff08;节点&#xff09;组成&#xff0c;这些节点按照不同层次排列&#xff0c;通常包括输入层、一个或多个隐藏层和输出层。每个神经元接收来自上一层神经元的输…...

YOLOv5训练长方形图像详解

文章目录 YOLOv5训练长方形图像详解一、引言二、数据集准备1、创建文件夹结构2、标注图像3、生成标注文件 三、配置文件1、创建数据集配置文件2、选择模型配置文件 四、训练模型1、修改训练参数2、开始训练 五、使用示例1、测试模型2、评估模型 六、总结 YOLOv5训练长方形图像详…...

【Vim Masterclass 笔记11】S06L24 + L25:Vim 文本的插入、变更、替换与连接操作同步练习(含点评课)

文章目录 S06L24 Exercise 06 - Inserting, Changing, Replacing, and Joining1 训练目标2 操作指令2.1. 打开 insert-practice.txt 文件2.2. 练习 i 命令2.3. 练习 I 命令2.4. 练习 a 命令2.5. 练习 A 命令2.6. 练习 o 命令2.7. 练习 O 命令2.8. 练习 j 命令2.9. 练习 R 命令2…...

【计算机网络】深入浅出计算机网络

第一章 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成一种重要的信息服务基础设施 CNNIC 中国互联网网络信息中心 因特网概述 网络、互联网和因特网 网络&#xff08;Network&#xff09;由若干结点&#xff08;Node&#xff09;和连接这些结点的链路…...

HTTP详解——HTTP基础

HTTP 基本概念 HTTP 是超文本传输协议 (HyperText Transfer Protocol) 超文本传输协议(HyperText Transfer Protocol) HTTP 是一个在计算机世界里专门在 两点 之间 传输 文字、图片、音视频等 超文本 数据的 约定和规范 1. 协议 约定和规范 2. 传输 两点之间传输&#xf…...

ubuntu 安装 python

一、安装python依赖的包。 sudo apt-get install -y make zlib1g zlib1g-dev build-essential libbz2-dev libsqlite3-dev libssl-dev libxslt1-dev libffi-dev openssl python3-tklibsqlite3-dev需要在python安装之前安装&#xff0c;如果用户操作系统已经安装python环境&…...

CSS:定位

CSS定位核心知识点详解 CSS定位是网页布局中的重要概念&#xff0c;它允许开发者将元素放置在页面的指定位置。以下是对CSS定位所有相关详细重要知识点的归纳&#xff1a; 为什么要使用定位&#xff1a; 小黄色块在图片上移动&#xff0c;吸引用户的眼球。 当我们滚动窗口的…...

ros2笔记-7.1 机器人导航介绍

7.1 机器人导航介绍 7.1.1 同步定位与地图构建 想要导航&#xff0c;就是要确定当前位置跟目标位置。确定位置就是定位问题。 手机的卫星导航在室内 受屏蔽&#xff0c;需要其他传感器获取位置信息。 利用6.5 章节的仿真&#xff0c;打开并运行 会发现轨迹跟障碍物都被记录…...

一些常见的Java面试题及其答案

Java基础 1. Java中的基本数据类型有哪些&#xff1f; 答案&#xff1a;Java中的基本数据类型包括整数类型&#xff08;byte、short、int、long&#xff09;、浮点类型&#xff08;float、double&#xff09;、字符类型&#xff08;char&#xff09;和布尔类型&#xff08;boo…...

今日总结 2025-01-14

学习目标 掌握运用 VSCode 开发 uni - app 的配置流程。学会将配置完善的项目作为模板上传至 Git&#xff0c;实现复用。项目启动 创建项目&#xff1a;借助 Vue - Cli 方式创建项目&#xff0c;推荐从国内地址 https://gitee.com/dcloud/uni - preset - vue/repository/archiv…...

图像处理|开运算

开运算是图像形态学中的一种基本操作&#xff0c;通常用于去除小的噪声点&#xff0c;同时保留目标物体的整体形状。它结合了 腐蚀 和 膨胀 操作&#xff0c;且顺序为 先腐蚀后膨胀&#xff08;先腐蚀后膨胀&#xff0c;胀开了&#xff0c;开运算&#xff09;。 开运算的作用 …...

基于当前最前沿的前端(Vue3 + Vite + Antdv)和后台(Spring boot)实现的低代码开发平台

项目是一个基于当前最前沿的前端技术栈&#xff08;Vue3 Vite Ant Design Vue&#xff0c;简称Antdv&#xff09;和后台技术栈&#xff08;Spring Boot&#xff09;实现的低代码开发平台。以下是对该项目的详细介绍&#xff1a; 一、项目概述 项目名称&#xff1a;lowcode-s…...

ASP.NET Core - 依赖注入(三)

ASP.NET Core - 依赖注入&#xff08;三&#xff09; 4. 容器中的服务创建与释放 4. 容器中的服务创建与释放 我们使用了 IoC 容器之后&#xff0c;服务实例的创建和销毁的工作就交给了容器去处理&#xff0c;前面也讲到了服务的生命周期&#xff0c;那三种生命周期中对象的创…...

Unity 视频导入unity后,播放时颜色变得很暗很深,是什么原因导致?

视频正常播放时的颜色&#xff1a; 但是&#xff0c;当我在unity下&#xff0c;点击视频播放按钮时&#xff0c;视频的颜色立马变得十分昏暗&#xff1a; 解决办法&#xff1a; 将File—BuildSettings—PlayerSettings—OtherSettings下的Color Space改为&#xff1a;Gamma即可…...

数仓建模(五)选择数仓技术栈:Hive ClickHouse 其它

在大数据技术的飞速发展下&#xff0c;数据仓库&#xff08;Data Warehouse&#xff0c;简称数仓&#xff09;成为企业处理和分析海量数据的核心工具。市场上主流数仓技术栈丰富&#xff0c;如Hive、ClickHouse、Druid、Greenplum等&#xff0c;对于初学者而言&#xff0c;选择…...

MySQL主从:如何处理“Got Fatal Error 1236”或 MY-013114 错误(percona译文)

错误的 GTID 如今&#xff0c;典型的复制设置使用 GTID 模式&#xff0c;完整的错误消息可能如下所示&#xff1a; mysql > show replica status\G *************************** 1. row ***************************Replica_IO_Running: NoReplica_SQL_Running: YesLast_I…...

01.14周二F34-Day55打卡

文章目录 1. Jim 在看电视的时候他的老婆正在做饭。(两个动作同时进行)2. 他刚睡着电话就响了。3. 我正在想事情,这时忽然有人从后面抓我胳膊。4. 我们总是边吃火锅边唱歌。5. 他一听说出了事故,马上就来了现场。6. He entered the room until I returned. (英译汉)7.直到…...

Docker 部署 Typecho

1. 官网 https://typecho.org/插件 & 主题 https://github.com/typecho-fans/plugins https://typechx.com/ https://typecho.work/2. 通过 compose 文件安装 github官网&#xff1a; https://github.com/typecho/Dockerfile 新建一个目录&#xff0c;存放 typecho 的相…...

electron 打包后的 exe 文件,运行后是空白窗口

一、代码相关问题 1. 页面加载失败 1.1 原因 在 Electron 应用中&#xff0c;若loadFile或loadURL方法指定的页面路径或 URL 错误&#xff0c;就无法正确加载页面&#xff0c;导致窗口空白。 1.2. 解决 仔细检查loadFile或loadURL方法中传入的路径或 URL 是否正确&#xf…...

《leetcode-runner》如何手搓一个debug调试器——架构

本文主要聚焦leetcode-runner对于debug功能的整体设计&#xff0c;并讲述设计原因以及存在的难点 设计引入 让我们来思考一下&#xff0c;一个最简单的调试器需要哪些内容 首先&#xff0c;它能够接受用户的输入 其次&#xff0c;它能够读懂用户想让调试器干嘛&#xff0c;…...

matlab实现了一个优化的遗传算法,用于求解注汽站最优位置的问题

function [best_chromosome, best_fitness] optimized_genetic_algorithm()%% 遗传算法参数初始化% 定义井信息&#xff0c;包括坐标、管道长度、流量、压力等wells defineWells(); % 返回井的结构体数组N length(wells); % 注汽井数量% 遗传算法相关参数L_chromosome 20; …...

八股学习 Redis

八股学习 Redis 使用场景常见问题问题1、2示例场景缓存穿透解决方案一解决方案二 问题3示例场景缓存击穿解决方案 问题4示例场景缓存雪崩解决方案 问题5示例场景双写一致性强一致方案允许延时一致方案 问题6RDB方式AOF方式两种方式对比 问题7示例场景惰性删除定期删除 使用场景…...

C++ 中 :: 的各种用法

C 中 :: 的各种用法 文章目录 C 中 :: 的各种用法1. 全局作用域解析示例&#xff1a;访问全局变量 2. 类作用域2.1. 访问类的静态成员示例&#xff1a;访问静态成员2.2. 定义类外成员函数示例&#xff1a;定义类外成员函数 3. 命名空间作用域3.1. 访问命名空间中的成员示例&…...

【Redis】初识分布式系统

目录 单机架构 分布式系统 应用数据分离架构 应用服务集群架构 读写分离/主从分离架构 冷热分离架构 垂直分库 微服务架构 分布式名词概念 本篇博文&#xff0c;将根据分布式系统的演进一步一步介绍每一种架构的形式&#xff0c;最后为大家总结了一些分布式中常用的…...

【EI 会议征稿】第四届材料工程与应用力学国际学术会议(ICMEAAE 2025)

2025 4th International Conference on Materials Engineering and Applied Mechanics 重要信息 大会官网&#xff1a;www.icmeaae.com 大会时间&#xff1a;2025年3月7-9日 大会地点&#xff1a;中国西安 截稿时间&#xff1a;2025年1月24日23:59 接受/拒稿通知&#xf…...

redisson 连接 redis5报错 ERR wrong number of arguments for ‘auth‘ command

依赖版本 org.redisson:redisson-spring-boot-starter:3.25.2 现象 启动报错 org.redisson.client.RedisException: ERR wrong number of arguments for ‘auth’ command. channel: [xxx] command: (AUTH), params: (password masked) 原因 redis6以下版本认证参数不包含用…...

GPT(General Purpose Timer)定时器

基本概念&#xff1a; 在嵌入式系统中&#xff0c;General Purpose Timer&#xff08;GPT&#xff09;是一种非常重要的硬件组件&#xff0c;用于提供定时功能。 定义&#xff1a;通用定时器是一种能够提供精确时间测量和控制功能的电子设备或电路模块。它可以产生周期性的时…...

Node.js - HTTP

1. HTTP请求 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是客户端和服务器之间通信的基础协议。HTTP 请求是由客户端&#xff08;通常是浏览器、手机应用或其他网络工具&#xff09;发送给服务器的消息&#xff0c;用来请求资源或执行…...

Vue数据响应式,reaction,ref的使用

目录 数据响应式 如何使用 reactionyu区别 数据响应式 什么是数据响应式 简单来说就是当数据变了的时候&#xff0c;页面的展示也会跟着发生变化。 在Vue当中我们有两个函数可以实现这个功能reaction&#xff0c;ref 如何使用 首先这两个函数在是在Vue对象中我们可以先对…...

【Vue实战】Vuex 和 Axios 拦截器设置全局 Loading

目录 1. 效果图 2. 思路分析 2.1 实现思路 2.2 可能存在的问题 2.2.1 并发请求管理 2.2.2 请求快速响应和缓存带来的问题 3. 代码实现 4. 总结 1. 效果图 如下图所示&#xff0c;当路由变化或发起请求时&#xff0c;出现 Loading 等待效果&#xff0c;此时页面不可见。…...

JVM:ZGC详解(染色指针,内存管理,算法流程,分代ZGC)

1&#xff0c;ZGC&#xff08;JDK21之前&#xff09; ZGC 的核心是一个并发垃圾收集器&#xff0c;所有繁重的工作都在Java 线程继续执行的同时完成。这极大地降低了垃圾收集对应用程序响应时间的影响。 ZGC为了支持太字节&#xff08;TB&#xff09;级内存&#xff0c;设计了基…...

在 Ubuntu 上安装和配置 Redis

在 Ubuntu 上安装和配置 Redis&#xff0c;并使用发布-订阅&#xff08;Pub/Sub&#xff09;功能&#xff0c;可以按照以下步骤进行&#xff1a; 一、安装 Redis 1. 更新包列表 首先&#xff0c;更新本地的包列表以确保获取到最新的软件包信息&#xff1a; sudo apt update…...

【WPS】【WORDEXCEL】【VB】实现微软WORD自动更正的效果

1. 代码规范方面 添加 Option Explicit&#xff1a;强制要求显式声明所有变量&#xff0c;这样可以避免因变量名拼写错误等情况而出现难以排查的逻辑错误&#xff0c;提高代码的健壮性。使用 On Error GoTo 进行错误处理&#xff1a;通过设置错误处理机制&#xff0c;当代码执行…...

相机SD卡照片数据不小心全部删除了怎么办?有什么方法恢复吗?

前几天&#xff0c;小编在后台友收到网友反馈说他在整理相机里的SD卡&#xff0c;原本是想把那些记录着美好瞬间的照片导出来慢慢欣赏。结果手一抖&#xff0c;不小心点了“删除所有照片”&#xff0c;等他反应过来&#xff0c;屏幕上已经显示“删除成功”。那一刻&#xff0c;…...

【机器学习:十四、TensorFlow与PyTorch的对比分析】

1. 发展背景与社区支持 1.1 TensorFlow的背景与发展 TensorFlow是Google于2015年发布的开源深度学习框架&#xff0c;基于其前身DistBelief系统。作为Google大规模深度学习研究成果的延续&#xff0c;TensorFlow从一开始就定位为生产级框架&#xff0c;强调跨平台部署能力和性…...