目录
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
cs// 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); // 异步调用外部API var reviews = await _httpClient.GetStringAsync($"https://api.reviews.com/products/{id}"); return Ok(new { product, reviews }); } }
2.大量异步任务管理(使用SemaphoreSlim)
注:可对同时访问资源或者资源池的线程数加以限制;精细控制特定操作的并发度
cs// 限制数据库连接并发访问 var dbSemaphore = new SemaphoreSlim(10); async Task QueryDatabase() { await dbSemaphore.WaitAsync(); try { /* 使用连接 */ } finally { dbSemaphore.Release(); } }
2.并行(Parallelist)概念和技术实现
核心概念:并行是多核CPU真正同时执行多个计算任务;
关键特征:
⚡ 物理上的同时:多个CPU核心同时工作
🔢 CPU密集型:适合数学计算、图像处理、数据分析
⚖️ 任务数 ≈ CPU核心数:最大化利用计算资源
🎯 提高计算吞吐量:缩短总体计算时间
技术实现:
1.Parallel类
cs// 数据并行处理 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)
cs// 大数据集并行查询 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.任务并行库
cs// 复杂计算任务的并行执行 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服务器、数据库 科学计算、图像处理