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服务器、数据库
科学计算、图像处理