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
英文地址,請注明出處:http://en.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;黑窗口常駐即…