C# 并发和并行的区别--16

目录

并发和并行

一.并发

定义

特点

代码示例

代码解释

二.并行

定义

特点

在C#中的体现

代码示例

代码解释

三.并发和并行的区别

四 .如何在C#中选择并发还是并行

1.考虑任务类型

2.代码示例

3.注意事项

五.总结


并发和并行

在编程领域,并发并行是两个密切相关但是又有区别的概念

它们都涉及到同时处理多个任务,但在执行方式,目的和实现上存在差异

一.并发

  1. 定义

    并发是指一个系统能够同时处理多个任务的能力.在并发执行中,多个任务在逻辑上是“同时”进行的,但在物理上可能并不是同时进行,而是通过在任务之间快速切换实现的
  2. 特点

    1. 任务交替进行:在单核处理器上,操作系统通过时间片轮转的方式,使多个任务看起来像是同时进行的
    2. 资源共享:并发任务共享同一资源,需要协调和同步,避免冲突
    3. 重点在于结构化程序:并发性使程序更易于建模和维护,因为它将复杂的流程分解为独立的任务
  3. 在C#中的体现:

    • 异步编程:
      • 使用async和await关键字,方法可以在等待I/O操作时释放线程
      • 适用于密集型任务,如文件读写,网络通信
    • 线程(Thread)和任务(Task):
      • 使用System.Threading命名空间下的Thread类
      • 使用System.Threading.Tasks命名空间下的Task类,实现更高级的并发模型
  4. 代码示例

    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);}}   
    }
    
  5. 代码解释

    • 在上述代码中,GetDataAsync方法是异步的,调用它并不会阻碍主线程
    • Task.WhenAll方法并发地等待多个任务完成,尽管在单核CPU上这些任务并不是物理上同时执行的

二.并行

  1. 定义

    1. 并行是指在物理上同时执行多个任务.在并行执行中,多个任务真正地在同一时间被多个处理器或多个处理器核心执行
  2. 特点

    1. 物理上的同时性:需要硬件支持,如多核 CPU 或多处理器系统
    2. 提高性能:通过同时执行多个计算密集型任务来缩短总的执行时间
    3. 任务独立性:并行任务通常是相互独立的,减少了同步和竞争的需要
  3. 在C#中的体现

    1. 并行LINQ(PLINQ):
      1. 使用并行化技术加速LINQ查询
      2. 位于System.LINQ命名空间
    2. 并行类:
      1. 位于System.Threading.Tasks下命名空间
      2. 提供Parallel.For和Parallel.ForEach等方法,轻松实现数据并行
    3. 任务并行库(Task Parallel Library,TPL):
      1. 基于任务的并行模型,充分利用多核处理器的性能
  4. 代码示例

    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("计算完成。");}
    }
    

  5. 代码解释

    Parallel.For方法会自动将循环迭代分配到多个线程,在多个CPU核心上同时运行
    1. 适用于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# 中,通过异步编程,线程,任务和并行类库,可以灵活地实现并发和并行,满足不同应用场景的需求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈云计算14 | 云存储技术

云存储技术 一、云计算网络存储技术基础1.1 网络存储的基本概念1.2云存储系统结构模型1.1.1 存储层1.1.2 基础管理层1.1.3 应用接口层1.1.4 访问层 1.2 网络存储技术分类 二、云计算网络存储技术特点2.1 超大规模与高可扩展性2.1.1 存储规模优势2.1.2 动态扩展机制 2.2 高可用性…

服务器数据恢复—EMC存储POOL中数据卷被删除的数据恢复案例

服务器数据恢复环境&故障&#xff1a; EMC Unity 400存储连接了2台硬盘柜。2台硬盘柜上一共有21块硬盘&#xff08;520字节&#xff09;。21块盘组建了2组RAID6&#xff1a;一组有11块硬盘&#xff0c;一组有10块硬盘。 在存储运行过程中&#xff0c;管理员误操作删除了 2组…

【Flink系列】10. Flink SQL

10. Flink SQL Table API和SQL是最上层的API&#xff0c;在Flink中这两种API被集成在一起&#xff0c;SQL执行的对象也是Flink中的表&#xff08;Table&#xff09;&#xff0c;所以我们一般会认为它们是一体的。Flink是批流统一的处理框架&#xff0c;无论是批处理&#xff08…

《Keras 3 神经网络紧凑型卷积转换器(Transformers)》

Keras 3 神经网络紧凑型卷积转换器&#xff08;Transformers&#xff09; 作者&#xff1a;Sayak Paul创建日期&#xff1a;2021/06/30最后修改时间&#xff1a;2023/08/07描述&#xff1a;用于高效图像分类的紧凑型卷积变压器。 &#xff08;i&#xff09; 此示例使用 Keras …

本地部署Web-Check网站检测与分析利器并实现远程访问实时监测

文章目录 前言1.关于Web-Check2.功能特点3.安装Docker4.创建并启动Web-Check容器5.本地访问测试6.公网远程访问本地Web-Check7.内网穿透工具安装8.创建远程连接公网地址9.使用固定公网地址远程访问 前言 本文我们将详细介绍如何在Ubuntu系统上使用Docker部署Web-Check&#xf…

Linux自学指南(学习路线大纲)

Linux入门与进阶指南 目录 第一部分 入门篇 第一章 Linux 系统 1.1 Unix&#xff1a;Linux的“祖师爷” 1.2 Linux 操作系统的诞生与发展历程 1.3 Linux 主要应用领域的归纳 1.4 开源社区的兴起 第二章 如何选择Linux发行版&#xff1f; 2.1 Debian GNU/Linux 2.2 Ubu…

常见好用的PHP CMS开源系统有哪些?

开源的系统&#xff0c;网站大家估计也见过很多&#xff0c;尤其是用PHP写的开源系统也很受用户们欢迎&#xff0c;这类系统通常以简单、使用、开源为优势&#xff0c;为用户提供更好的服务。以下就为大家介绍几个常见且好用的PHP CMS开源系统。欢迎补充&#xff01; 1、WordP…

Mybatis Plus 分页实现

目录 前言&#xff1a; 一、分页插件 1、添加配置类 &#xff08;1&#xff09;创建配置类方式: &#xff08;2&#xff09;启动类中配置分页插件方式(推荐): 2、测试 二、XML自定义分页 1、UserMapper中定义接口方法 2、UserMapper.xml中编写SQL ​编辑 3、测试 前…

玩转大语言模型——使用graphRAG+Ollama构建知识图谱

系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 文章目录 系列文章目录前言下载和安装用下载项目的方式下载并安装用pip方式下载并安装 生成知识图谱初始化文件夹修改模型配置修改知识库生成配置创…

[AUTOSAR通信篇] - AutoSAR通信架构

点击订阅专栏不迷路 文章目录 一、通信驱动二、通信硬件抽象三、通信服务3.1 CAN通信协议栈3.2 J1939通信协议栈3.3 LIN通信协议栈3.4 FlexRay通信协议栈3.5 ETH通信协议栈 返回总目录 先看一张图&#xff0c;这是整个BSW层可以提供的服务&#xff0c;今天我们重点来讲一讲这个…

mac配置 iTerm2 使用lrzsz与服务器传输文件

mac配置 1. 安装支持rz和sz命令的lrzsz brew install lrzsz2. 下载iterm2-send-zmodem.sh和iterm2-recv-zmodem.sh两个脚本 # 克隆仓库 git clone https://github.com/aikuyun/iterm2-zmodem ~/iterm2-zmodem# 进入到仓库目录 cd ~/iterm2-zmodem# 设置脚本文件可执行权限 c…

两级式三相光伏并网逆变器Matlab/Simulink仿真模型

忘记更新最经典的光伏并网仿真模型了&#xff0c;作为包含经典的MPPT和并网恒功率因素的双闭环控制模型&#xff0c;也是很多相关专业学生的入门研究内容&#xff0c;光伏并网模型三相的和单相都有。 其中三相光伏并网逆变器有大功率和小功率的两种&#xff0c;之前早在硕士期…

人工智能之深度学习_[2]-PyTorch入门

PyTorch 1.PyTorch简介 1.1 什么是PyTorch PyTorch是一个基于Python的科学计算包 PyTorch安装 pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simplePyTorch一个基于Python语言的深度学习框架&#xff0c;它将数据封装成张量&#xff08;Tensor&#xff09;来进行…

ASP.NET Core - 配置系统之配置添加

ASP.NET Core - 配置系统之配置添加 2. 配置添加 2. 配置添加 配置系统可以读取到配置文件中的信息&#xff0c;那必然有某个地方可以将配置文件添加到配置系统中。之前的文章中讲到 ASP.NET Core 入口文件中&#xff0c;builder(WebApplicationBuilder 对象) 中有一个 Config…

GIS大模型:交通领域方面的应用

文章目录 1. 实时交通流量预测&#xff1a;2. 动态信号灯控制&#xff1a;3. 交通流模式识别&#xff1a;4. 交通事故预警&#xff1a;5. 路径推荐与导航优化&#xff1a;6. 长期交通规划&#xff1a;7. 事件影响分析&#xff1a;8. 智能停车管理&#xff1a; 大模型在交通流量…

Redis复制(replica)

Redis主从复制 [Redis主从复制]&#xff08;replica&#xff09;是一个多Redis实例进行数据同步的过程&#xff0c;其中一个实例是主实例&#xff08;Master&#xff09;&#xff0c;其他实例是从实例&#xff08;Slave&#xff09;。主实例负责处理命令请求&#xff0c;而从实…

零基础构建最简单的 Tauri2.0 桌面项目 Star 88.4k!!!

目录 预安装环境 安装nodejs windows下安装 linux下安装 nodejs常遇问题 安装C环境 介绍 下载 安装 安装Rust语言 Tauri官网 安装 vscode 安装 rust 插件 安装 Tauri 插件 运行成果 预安装环境 安装nodejs windows下安装 NodeJs_安装及下载_哔哩哔哩_bilibi…

wproxy客户端安装,代理返回JSON

文章目录 一、wproxy基础信息二、使用wproxy客户端代理返回参数 一、wproxy基础信息 https://github.com/avwo/whistle github https://wproxy.org/whistle/quickstart.html 快速上手 Whistle 是基于 Node.JS 实现的操作简单、功能强大的跨平台抓包调试工具&#xff0c;可作为…

Ubuntu本地部署网站

目录 1.介绍 2.安装apache 3.网页升级 1.介绍 网站其实就相当于一个文件夹&#xff0c;用域名访问一个网页&#xff0c;就相当于访问了一台电脑的某一个文件夹&#xff0c;在网页中看见的视频&#xff0c;视频和音乐其实就是文件夹里面的文件。为什么网页看起来不像电脑文件夹…

jenkins-node节点配置

一.简述&#xff1a; Jenkins有一个很强大的功能&#xff1a; 即&#xff1a;支持分布式构建(jenkins配置中叫节点(node),也被称为slave)。分布式构建通常是用来吸收额外的负载。通过动态添加额外的机器应对构建作业中的高峰期&#xff0c;或在特定操作系统或环境运行特定的构建…