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

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服务器、数据库 科学计算、图像处理
相关推荐
爬虫程序猿9 小时前
用 Python 给京东商品详情做“全身 CT”——可量产、可扩展的爬虫实战
开发语言·爬虫·python
徐同保11 小时前
tailwindcss暗色主题切换
开发语言·前端·javascript
蓝纹绿茶11 小时前
bash:**:pip:***python: 错误的解释器: 没有那个文件或目录
开发语言·python·pip
云知谷11 小时前
【经典书籍】C++ Primer 第15章类虚函数与多态 “友元、异常和其他高级特性” 精华讲解
c语言·开发语言·c++·软件工程·团队开发
START_GAME12 小时前
深度学习Diffusers:用 DiffusionPipeline 实现图像生成
开发语言·python·深度学习
不爱编程的小九九12 小时前
小九源码-springboot088-宾馆客房管理系统
java·开发语言·spring boot
李趣趣12 小时前
数据库字段类型bit容易被忽视的bug
c#·bug
Evand J13 小时前
【MATLAB例程】到达角度定位(AOA),平面环境多锚点定位(自适应基站数量),动态轨迹使用EKF滤波优化。附代码下载链接
开发语言·matlab·平面·滤波·aoa·到达角度
细节控菜鸡13 小时前
【2025最新】ArcGIS for JS 实现随着时间变化而变化的热力图
开发语言·javascript·arcgis
Pluto_CSND13 小时前
Java实现gRPC双向流通信
java·开发语言·单元测试