C# 并发和并行的区别--16
目录
并发和并行
一.并发
定义
特点
代码示例
代码解释
二.并行
定义
特点
在C#中的体现
代码示例
代码解释
三.并发和并行的区别
四 .如何在C#中选择并发还是并行
1.考虑任务类型
2.代码示例
3.注意事项
五.总结
并发和并行
在编程领域,并发和并行是两个密切相关但是又有区别的概念
它们都涉及到同时处理多个任务,但在执行方式,目的和实现上存在差异
一.并发
-
定义
并发是指一个系统能够同时处理多个任务的能力.在并发执行中,多个任务在逻辑上是“同时”进行的,但在物理上可能并不是同时进行,而是通过在任务之间快速切换实现的 -
特点
- 任务交替进行:在单核处理器上,操作系统通过时间片轮转的方式,使多个任务看起来像是同时进行的
- 资源共享:并发任务共享同一资源,需要协调和同步,避免冲突
- 重点在于结构化程序:并发性使程序更易于建模和维护,因为它将复杂的流程分解为独立的任务
-
在C#中的体现:
- 异步编程:
- 使用async和await关键字,方法可以在等待I/O操作时释放线程
- 适用于密集型任务,如文件读写,网络通信
- 线程(Thread)和任务(Task):
- 使用System.Threading命名空间下的Thread类
- 使用System.Threading.Tasks命名空间下的Task类,实现更高级的并发模型
- 异步编程:
-
代码示例
using System; using System.Net.Http; using System.Threading.Tasks;class Program {static async Task Main(){Task<string> task1 = GetDataAsync("http://example.com/data1");Task<string> task2 = GetDataAsync("http://example.com/data2");// 并发执行两个异步任务string[] results = await Task.WhenAll(task1, task2);Console.WriteLine(results[0]);Console.WriteLine(results[1]);}static async Task<string> GetDataAsync(string url){using (HttpClient client = new HttpClient()){return await client.GetStringAsync(url);}} } -
代码解释
- 在上述代码中,GetDataAsync方法是异步的,调用它并不会阻碍主线程
- Task.WhenAll方法并发地等待多个任务完成,尽管在单核CPU上这些任务并不是物理上同时执行的
二.并行
-
定义
- 并行是指在物理上同时执行多个任务.在并行执行中,多个任务真正地在同一时间被多个处理器或多个处理器核心执行
-
特点
- 物理上的同时性:需要硬件支持,如多核 CPU 或多处理器系统
- 提高性能:通过同时执行多个计算密集型任务来缩短总的执行时间
- 任务独立性:并行任务通常是相互独立的,减少了同步和竞争的需要
-
在C#中的体现
- 并行LINQ(PLINQ):
- 使用并行化技术加速LINQ查询
- 位于System.LINQ命名空间
- 并行类:
- 位于System.Threading.Tasks下命名空间
- 提供Parallel.For和Parallel.ForEach等方法,轻松实现数据并行
- 任务并行库(Task Parallel Library,TPL):
- 基于任务的并行模型,充分利用多核处理器的性能
- 并行LINQ(PLINQ):
-
代码示例
using System; using System.Threading.Tasks;class Program {static void Main(){// 定义一个大型数组int[] numbers = new int[100000000];Parallel.For(0, numbers.Length, i =>{numbers[i] = i * i;});Console.WriteLine("计算完成。");} } -
代码解释
Parallel.For方法会自动将循环迭代分配到多个线程,在多个CPU核心上同时运行- 适用于CPU密集型计算任务,可以显著提高性能
三.并发和并行的区别
| 并发 | 并行 | |
| 定义 | 系统处理多个任务的能力,通过任务切换,实现逻辑上的同时执行 | 多个任务在物理上同时执行,需要多核或多处理器硬件支持 |
| 执行 | 任务交替进行,可能不是同时执行 | 任务真正地同时执行 |
| 目的 | 提高资源利用率和系统吞吐量,提高程序的响应性 | 缩短任务的执行时间,提高计算性能 |
| 适用 | I/O 密集型任务,事件驱动程序,GUI 应用 | 计算密集型任务,如科学计算,大数据处理 |
| 实现 | 线程,异步编程,任务调度 | 多线程加上多处理器或多核处理器,并行算法 |
| 挑战 | 需要处理任务同步,共享资源竞争,避免死锁和竞态条件 | 分解任务,负载均衡,减少线程间通信和同步开销 |
四 .如何在C#中选择并发还是并行
1.考虑任务类型
- I/O密集型任务(网络请求,文件读写):
- 使用并发类型,异步编程
- 因为I/O操作速度慢,线程在等待I/O时可以切换执行其他任务,提高效率
- CPU密集型任务(复杂计算,数据处理):
- 使用并行模型,充分利用CPU
- 通过并行算法将任务分解为可同时执行的子任务
2.代码示例
并发异步调用:
using System;
using System.Net.Http;
using System.Threading.Tasks;class Program
{static async Task Main(){Task<string> task1 = GetDataAsync("http://example.com/data1");Task<string> task2 = GetDataAsync("http://example.com/data2");// 并发执行两个异步任务string[] results = await Task.WhenAll(task1, task2);Console.WriteLine(results[0]);Console.WriteLine(results[1]);}static async Task<string> GetDataAsync(string url){using (HttpClient client = new HttpClient()){return await client.GetStringAsync(url);}}
}
并行处理数据:
using System;
using System.Threading.Tasks;
using System.Linq;class Program
{static void Main(){int[] numbers = Enumerable.Range(0, 1000000).ToArray();var evenNumbers = numbers.AsParallel().Where(n => n % 2 == 0).ToArray();Console.WriteLine($"找到 {evenNumbers.Length} 个偶数。");}
}
3.注意事项
- 线程安全和同步
- 无论是并发还是并行,都需要处理共享数据的同步问题
- 使用锁,互斥量,信号量和无锁编程技术,避免数据竞争
- 性能权衡
- 并行化需要考虑线程创建和上下文切换的开销
- 任务过小,可能得不偿失;任务过大,可能无法充分利用并行性
- 异常处理
- 并行任务中的异常处理需要格外注意,使用AggregateException捕获并处理
五.总结
- 并发关注在单个处理器上交替执行多个任务,提高资源利用率和响应性
- 并行关注在多个处理器上同时执行多个任务,缩短执行时间,提升计算性能
- 在 C# 中,通过异步编程,线程,任务和并行类库,可以灵活地实现并发和并行,满足不同应用场景的需求
相关文章:
C# 并发和并行的区别--16
目录 并发和并行 一.并发 定义 特点 代码示例 代码解释 二.并行 定义 特点 在C#中的体现 代码示例 代码解释 三.并发和并行的区别 四 .如何在C#中选择并发还是并行 1.考虑任务类型 2.代码示例 3.注意事项 五.总结 并发和并行 在编程领域,并发和并行是两个密切…...
Java日志配置
1.导入依赖 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.23.1</version></dependency><dependency><groupId>org.apache.logging.log4j</groupI…...
python中的RPA->playwright自动化录制脚本实战案例笔记
playwright录制功能使用绕过登录操作 1、首先安装playwright pip install playwright2、 安装支持的浏览器 playwright install # 安装支持的浏览器:cr, chromium, ff, firefox, wk 和 webkit3、接着在自己的项目下运行录制命令: playwright codegen…...
Linux查看日志命令
问题排查过程: 1. 评估问题现象是否是操作问题,还是服务bug,页面出异常信息是后端,没抛异常信息有可能是前端渲染问题,F12抓包看那个字段没有数据(有时候需要前端帮忙确定是哪一个字段)&#x…...
(8)ERC20详细介绍
ERC20 是以太坊上的一种代币标准(同质化代币),由 Fabian Vogelsteller 在 2015 年提出。它定义了一组通用的接口和规则,使得开发者可以创建可互操作的代币。ERC20 代币在以太坊生态系统中非常流行,广泛应用于各种去中心…...
opencv projectPoints函数 computeCorrespondEpilines函数 undistortPoints函数
opencv projectPoints函数 cv::projectPoints 是 OpenCV 中用于将三维点投影到二维图像平面的函数。它通常用于计算在相机坐标系下的三维点在图像坐标系中的位置,考虑了相机的内参和外参。 函数原型 void cv::projectPoints(InputArray objectPoints,InputArray …...
springboot集成websocket实现实时大量数据,效率性能高
前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下! 也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习&…...
游戏引擎学习第80天
Blackboard:增强碰撞循环,循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改,以便实现一些新的功能。具体来说,是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏,目标是构建一些更丰富…...
Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步
在 Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步(Master-Slave Replication) 的过程略有不同,因为两者的 MySQL 版本和环境存在差异。以下是详细步骤,帮助你完成跨平台的主从…...
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
: 羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?spm1010.2135.3001.5343 在本篇文章中,博主将带大家去学习所谓的…...
Sentinel配置流控规则详解
前言 在微服务架构中,流量控制(Flow Control)是保障服务稳定性的重要手段之一。Sentinel作为一款开源的流量控制、熔断降级Java库,以其丰富的应用场景和完善的监控能力,在微服务保护中扮演了重要角色。本文将详细介绍…...
解锁动态规划的奥秘:从零到精通的创新思维解析(6)
解锁动态规划的奥秘:从零到精通的创新思维解析(6) 前言: 在动态规划的众多问题中,多状态DP问题是一个非常重要的类别。它的难点在于如何设计合适的状态表示和转移方程,从而高效地解决问题。 多状态DP的核…...
Qwen2.5 3B、7B、14B在文本按照规范进行标准化改写任务上的表现
任务介绍:军事杂志方向资料标准化改写任务 1. 任务目标 本任务的目标是对军事杂志领域的非标准化资料进行改写,确保其符合军事文献的写作规范和标准格式。通过改写,保留原文的核心内容和信息,同时提升语言的准确性、简洁性和专业…...
Oracle报错ORA-01078、LRM-00109
虚拟机异常关机后,rac数据库备机无法启动数据库,报错如下 解决方法: 找到如下路径文件 执行: cp init.ora.016202516818 /u01/app/oracle/product/19.3.0/db/dbs/ mv init.ora.016202516818 initplm2.ora 再次进入命令行sqlpl…...
免费为企业IT规划WSUS:Windows Server 更新服务 (WSUS) 之快速入门教程(一)
哈喽大家好,欢迎来到虚拟化时代君(XNHCYL),收不到通知请将我点击星标!“ 大家好,我是虚拟化时代君,一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…...
Titans 架构中的记忆整合:Memory as a Context;Gated Memory;Memory as a Layer
Titans 架构中的记忆整合 Titans 架构中的记忆整合 Memory as a Context(MAC)变体:在处理长序列数据时,将序列分段,对于当前段 S ( t ) S^{(t)}...
无缝过渡:将 Ansys 子结构模型转换为 Nastran
了解如何将 Ansys 子结构模型无缝转换为 Nastran,以满足有效载荷动态模型要求 Ansys 子结构模型的优势 Ansys 子结构模型为从事大型装配体结构分析和仿真的工程师和分析师提供了多项优势。 这些模型通过将复杂结构划分为更小、更易于管理的子结构,可以…...
小哆啦的跳跃挑战:能否突破迷宫的极限?
小哆啦开始力扣每日一题的第六天 https://leetcode.cn/problems/jump-game/description/ 小哆啦的跳跃挑战:能否突破迷宫的极限? 第一阶段:小哆啦的初次尝试 —— 盲目跳跃 小哆啦刚进入跳跃之城,他决定采用一种非常直接的方法来…...
KubeSphere部署安装,接入KubeKey安装的k8s集群
KubeSphere安装接入KubeKey安装的k8s集群 文章目录 KubeSphere安装接入KubeKey安装的k8s集群 一.NFS安装配置1.服务器安装NFS服务2.下载并部署 NFS Subdir External Provisioner1).下载部署文件2).创建 NameSpace3).创建 RBAC 资源4).配置 deployment.yaml5).部署 Storage Clas…...
Object常用的方法及开发中的使用场景
在前端开发中,Object 对象提供了许多常用的方法,这些方法帮助我们操作对象的属性和结构。以下是常用的 Object 方法及其功能简要说明: 对象常用的方法 1. 创建对象 Object.create(proto[, propertiesObject]) 创建一个具有指定原型对象和属性…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
