C#高并发与并行理解处理

目录

1.什么是IO密集型任务/CPU密集型任务

2.高并发概念和技术实现

2.并行(Parallelist)概念和技术实现

4.核心区别对比

1.什么是IO密集型任务/CPU密集型任务

1.IO密集型任务:

定义:任务核心逻辑不依赖CPU计算,而是大部分时间等待外部IO(指程序与外部设备(如:磁盘,网络,数据库,键盘鼠标)的数据交互)操作;

简单说:CPU在“等”,没干活

核心特征:

        等待事件远大于计算时间;

        CPU利用率低:若用单线程处理IO密集型任务,CPU会频繁处于“空闲等待”,资源浪费

        并发价值高:可以通过多线程/异步,同时去处理其他任务,提高单位时间内任务吞吐量

        注意:绝不用 “单线程同步”:正确做法是用async/await异步,让 CPU “同时处理多个等待中的 IO 任务”。

异步的核心:“非阻塞等待”CPU无需等待IO完成,可继续处理其他任务,IO处理完成再回调处理结果,最大化CPU利用率。

2.CPU密集型任务

定义:CPU始终处于“满负荷工作”状态,直到计算完成;

核心特征:

        计算时间远大于等待时间;

        CPU利用率高:单线程处理时,CPU 会被 100% 占用(直到任务完成),但仅能利用一个 CPU 核心,多核 CPU 资源被浪费;那多线程和多核CPU是什么关系

        并行价值高;

注意:CPU 密集型任务:绝不用 “大量线程并行”
若为 CPU 密集型任务创建远超 CPU 核心数的线程(如 16 核 CPU 创建 100 个线程),会导致线程频繁切换(上下文切换开销),反而降低计算效率。正确做法是用Parallel或控制线程数(如线程数 = CPU 核心数),避免切换浪费。

        

2.高并发概念和技术实现

概念:是指系统在单位时间内处理大量同时发生的请求或者任务的能力;

关键特征:

  • 🔁 ​​逻辑上的同时​​:通过时间片轮转模拟同时执行

  • ⚡ ​​I/O密集型​​:适合网络请求、文件操作、数据库访问

  • 🧵 ​​少量线程服务大量请求​​:线程数可能远大于CPU核心数

  • 🎯 ​​提高资源利用率​​:在等待I/O时释放线程处理其他任务

技术实现

1.asybc/await

// Web API 中的高并发处理
[ApiController]
public class ProductsController : ControllerBase
{[HttpGet("{id}")]public async Task<IActionResult> GetProduct(int id){// 异步数据库查询 - I/O等待时线程可处理其他请求var product = await _dbContext.Products.FindAsync(id);// 异步调用外部APIvar reviews = await _httpClient.GetStringAsync($"https://api.reviews.com/products/{id}");return Ok(new { product, reviews });}
}

2.大量异步任务管理(使用SemaphoreSlim)

注:可对同时访问资源或者资源池的线程数加以限制;精细控制特定操作的并发度

// 限制数据库连接并发访问
var dbSemaphore = new SemaphoreSlim(10);
async Task QueryDatabase()
{await dbSemaphore.WaitAsync();try { /* 使用连接 */ }finally { dbSemaphore.Release(); }
}

2.并行(Parallelist)概念和技术实现

核心概念:并行是多核CPU真正同时执行多个计算任务;

关键特征:

  • ⚡ ​​物理上的同时​​:多个CPU核心同时工作

  • 🔢 ​​CPU密集型​​:适合数学计算、图像处理、数据分析

  • ⚖️ ​​任务数 ≈ CPU核心数​​:最大化利用计算资源

  • 🎯 ​​提高计算吞吐量​​:缩短总体计算时间

技术实现:

1.Parallel类

// 数据并行处理
public void ProcessImagesInParallel(List<Image> images)
{Parallel.ForEach(images, image =>{// 每个图像在独立CPU核心上处理image.Resize(800, 600);image.ApplyFilter(FilterType.Sharpen);image.SaveToDisk();});Console.WriteLine("所有图像处理完成");
}

2.PLINQ(并行LINQ)

// 大数据集并行查询
public List<Customer> FindHighValueCustomers(List<Customer> customers)
{return customers.AsParallel().WithDegreeOfParallelism(Environment.ProcessorCount).Where(c => c.TotalPurchases > 10000).Where(c => c.IsActive).OrderByDescending(c => c.TotalPurchases).ToList();
}

3.任务并行库

// 复杂计算任务的并行执行
public async Task<double[]> ComputeComplexResultsAsync()
{var tasks = new Task<double>[4];// 同时执行多个计算任务tasks[0] = Task.Run(() => CalculatePi(1000000));tasks[1] = Task.Run(() => CalculateE(1000000));tasks[2] = Task.Run(() => CalculatePrimeNumbers(100000));tasks[3] = Task.Run(() => CalculateFibonacci(1000));return await Task.WhenAll(tasks);
}

4.核心区别对比

特性

高并发(Concurrency)

并行(Parallelism)

​目标​

提高资源利用率

提高计算吞吐量

​执行方式​

逻辑并发(交替执行)

物理并发(同时执行)

​适用场景​

I/O密集型操作

CPU密集型操作

​线程关系​

线程数 ≫ 核心数

线程数 ≈ 核心数

​关键技术​

async/await, Task

Parallel, PLINQ

​性能瓶颈​

I/O速度、网络延迟

CPU计算能力

​典型应用​

Web服务器、数据库

科学计算、图像处理

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

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

相关文章

正点原子STM32F407 U盘升级程序(IAP)OTA Bootloader APP USB升级+FATFS+USB Host

正点原子STM32F407 U盘升级程序&#xff08;IAP&#xff09;OTA Bootloader APP USB升级FATFSUSB HostChapter0 解决STM32 Bootloader跳转APP失败问题问题背景问题描述问题解决原APP跳转的函数为&#xff1a;修改APP程序main入口处Chapter1 MDK如何生成*.bin格式的文件Chapter2…

MySQL 8.0 在 Ubuntu 22.04 中如何将启用方式改为mysql_native_password(密码认证)

MySQL 8.0 在 Ubuntu 22.04 中默认启用了 auth_socket 认证方式(而非密码认证),导致 mysql_secure_installation 跳过了 root 密码设置。这会直接影响后续用 Navicat 连接 MySQL(因为 Navicat 需要密码登录),必须手动调整 root 用户的认证方式并设置密码。 核心问题:au…

七层网络协议-面试

七层网络协议概述七层网络协议&#xff0c;即OSI&#xff08;Open Systems Interconnection&#xff09;模型&#xff0c;是由国际标准化组织&#xff08;ISO&#xff09;提出的网络通信框架。它将网络通信过程划分为七个层次&#xff0c;每一层负责特定的功能&#xff0c;并通…

【Blender】二次元人物制作【二】:五官的制作

一、制作眼睛 选中眼眶内部的一圈线。shiftD复制出来调整成圆形&#xff0c;然后F快捷键填充将眼睛放在眼框内合适的位置&#xff0c;并用i键进行几次内插&#xff0c;做出瞳孔&#xff0c;并且将内部的眼瞳做得稍微向内凹陷一点。二、制作睫毛 选中眼眶上半部分的面&#xff0…

Deepin 25 系统安装 Docker:完整教程 + 常见问题解决

Deepin 25 系统安装 Docker&#xff1a;完整教程 常见问题解决 作为基于 Debian 的 Linux 发行版&#xff0c;Deepin 25 因系统目录&#xff08;如/usr&#xff09;默认只读的特性&#xff0c;安装 Docker 时需特殊处理 GPG 公钥存储路径。本文结合社区实践&#xff0c;整理出…

Redis MySQL小结

问题1&#xff1a;Redis为什么高效&#xff1f;答&#xff1a;基于内存&#xff0c;reactor&#xff0c;value的数据组织&#xff08;五种数据结构&#xff09;&#xff0c;KV的数据组织方式&#xff08;渐进hash&#xff09;问题2&#xff1a;跳表是什么&#xff1f;和红黑树的…

Flink on YARN 实战问题排查指南(精华版)

一、客户端常见问题速查 ‌1. JAR加载失败终极解法‌报错提示&#xff1a;"Could not build the program from JAR file" 核心原因&#xff1a;80%的情况是Hadoop依赖缺失 黄金配置&#xff1a;export HADOOP_CONF_DIR${HADOOP_HOME}/etc/hadoop export HADOOP_CLASS…

迅为RK3576开发板Android12制作使用系统签名

配套资料在网盘资料“iT0P-RK3576 开发板\02_【iTOP-RK3576 开发板】开发资料\ 08Android 系统开发配套资料\ 07 Android 制作使用系统签名”目录下制作签名文件 在 Android 源码 build/make/target/product/security/下存放着签名文件&#xff0c;如下所示&#xff1a;将北京迅…

django连接minio实现文件上传下载(提供接口示例)

django连接minio实现文件上传下载&#xff08;提供接口示例&#xff09;项目环境前提1.模型创建2. 在 settings.py 中添加 MINIO 配置3.创建 MINIO 工具类4.创建序列化器5. 创建视图6. 配置 URL 路由7.接口测试项目环境前提 已安装python3.8以上环境已安装djangorestframework…

Kafka消息队列进阶:发送策略与分区算法优化指南

Kafka消息队列进阶&#xff1a;发送策略与分区算法优化指南 目录Kafka消息队列进阶&#xff1a;发送策略与分区算法优化指南摘要1. Kafka消息发送模式概述1.1 消息发送的核心流程1.2 三种发送模式对比2. 同步发送模式详解2.1 同步发送实现原理2.2 同步发送性能优化3. 异步发送模…

【VScode】ssh报错

【VScode】ssh报错1. ssh报错2. 解决1. ssh报错 Failed to parse remote port from server output 2. 解决 windows电脑删除 C:\Users\username\.ssh\known_hosts linux cd /home/username/.vscode-server/ rm -rf ~/.vscode-server重新回到Vscode连接ok

Grafana+Loki+Alloy构建企业级日志平台

1.日志系统介绍日志系统&#xff1a;GLA、ELK、数仓 ⽇志处理流程&#xff1a;采集 > 存储 > 检索 > 可视化日志系统工作流程&#xff1a;日志平台的目的&#xff1a;统一聚合分散的日志日志平台搭建方案&#xff1a;ELK&#xff1a;ElasticSearch:存储日志&#xff0…

老梁聊全栈系列:(阶段一)现代全栈的「角色边界」与「能力雷达图」

JAVA Vue/React 双栈工程师的「T 型→E 型」进化指南 接上篇《从单体到云原生的演进脉络》 大家好&#xff0c;我是技术老梁&#xff0c;这是系列文章的第五篇。欢迎大家讨论&#xff0c;分享经验。如果知识对你有用&#xff0c;关注我&#xff0c;多多支持老梁&#xff0c;鼓…

使用 C# 设置 Excel 单元格格式

在实际报表开发中&#xff0c;Excel 的可读性和美观性与数据本身同样重要。合理的单元格格式设置不仅能让数据一目了然&#xff0c;还能让报表显得更专业。通过使用 C#&#xff0c;开发者可以精确控制 Excel 文件的单元格样式&#xff0c;无需依赖 Microsoft Office。 本文演示…

Redis篇章3:Redis 企业级缓存难题全解--预热、雪崩、击穿、穿透一网打尽

在企业级应用场景中&#xff0c;Redis 作为高性能缓存利器&#xff0c;极大提升了系统响应速度&#xff0c;但随着业务复杂度和并发量的攀升&#xff0c;缓存相关的各类挑战也接踵而至。比如系统启动时缓存缺失导致的数据库压力、大量缓存同时失效引发的连锁故障、热点数据过期…

【数值分析】02-绪论-误差

参考资料&#xff1a; 书籍&#xff1a; 数值分析简明教程/王兵团&#xff0c;张作泉&#xff0c;张平福编著. --北京&#xff1a;清华大学出版社&#xff1b;北京交通大学出版社&#xff0c;2012.8 视频&#xff1a;学堂在线APP中北京交通大学“数值分析I” 前期回顾 【数值分…

P3918 [国家集训队] 特技飞行

P3918 [国家集训队] 特技飞行 - 洛谷 思路&#xff1a; 因为如果连续进行相同的动作&#xff0c;乘客会感到厌倦&#xff0c;所以定义某次动作的价值为(距上次该动作的时间) ci​&#xff0c;若为第一次进行该动作&#xff0c;价值为 0。同一个动作&#xff0c;价值为ci*(最后一…

Python爬虫实战:研究Pandas,构建期货数据采集和分析系统

1. 引言 1.1 研究背景 期货市场作为金融市场的重要组成部分,具有价格发现、风险管理和资源配置的重要功能。上海期货交易所(Shanghai Futures Exchange, SHFE)作为中国四大期货交易所之一,上市交易的品种包括铜、铝、锌、黄金、白银等多种大宗商品期货,其交易数据反映了…

Linux第十七讲:应用层自定义协议与序列化

Linux第十七讲&#xff1a;应用层自定义协议与序列化1.什么是序列化和反序列化2.重新理解read、write为什么支持全双工3.网络版计算器的实现3.1socket的封装 -- 模板方法模式引入3.2序列化和反序列化 && json3.3协议的实现3.4 服务端整体看 -- 所有代码3.5七层协议&…

附录:Tomcat下载及启动

一、打开Tomcat官网windows下载第四个压缩包&#xff0c;下载完成后解压缩。&#xff08;安装路径不要带有中文和特殊符号&#xff09;二、启动Tomcat进入bin文件夹&#xff1a;\Tomcat\apache-tomcat-11.0.11\bin&#xff0c;找到startup.bat文件点击&#xff0c;黑窗口常驻即…