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,一经查实,立即删除!

相关文章

Android SystemUI——车载CarSystemUI加载(八)

Android 系统早期的状态栏和导航栏对于手机设备来说那是相当重要的,但是随着手机版本的不断更新,状态栏和导航栏对于手机的重要性在逐渐降低,特别是在快捷手势出现之后,导航栏几乎变得可有可无。但是对于当前如火如荼的车载系统来说,状态栏和导航栏却几乎是必备的,谷歌自…

《零基础Go语言算法实战》【题目 4-3】请用 Go 语言编写一个验证栈序列是否为空的算法

《零基础Go语言算法实战》 【题目 4-3】请用 Go 语言编写一个验证栈序列是否为空的算法 给定两个具有不同值的 push 和 pop 数组序列&#xff0c;当且仅当这可能是对最初为空的栈的一系 列 push 和 pop 操作的结果时才返回 true。 【解答】 ① 思路。 这是考查栈操作的题…

网络学习记录5

二、学习网络知识&#xff1a; 1、透传&#xff1a; ①“透传”指的是数据在传输过程中不被交换机或其他网络设备解析、修改或处理&#xff0c;而是直接从一个端口传输到另一个端口。这种传输方式保持了数据的原始性和完整性&#xff0c;常用于需要高速、低延迟的数据传输场景…

浅谈云计算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 高可用性…

vscode项目依赖问题

必读 一定要将前端下拉的项目备份一下&#xff0c;很容易运行导致依赖报错&#xff0c;重新下载 命令 使用幽灵分解器安装 pnpm install 替代 npm install 设置淘宝NPM镜像源 yarn config set registry https://registry.npmmirror.com 查看目前依赖包的版本 npm list ant-d…

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

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

【LLM】25.1.15 arxiv更新37篇

—第1篇---- Consistency of Responses and Continuations Generated by Large Language Models on Social Media &#x1f50d; 关键词: Large Language Models, emotional consistency, semantic coherence, social media, Gemma, Llama 链接1 摘要: 本文研究了大型语言模…

【Flink系列】10. Flink SQL

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

【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(4)

1.问题描述&#xff1a; 添加了很多的marker点&#xff0c;每个marker点都设置了customInfoWindow&#xff0c;但是每次只能显示一个customInfoWindow吗&#xff1f; 解决方案&#xff1a; Marker的InfoWindow每次只能显示一个。 2.问题描述&#xff1a; 在地图选型中&…

OpenCV相机标定与3D重建(59)用于立体相机标定的函数stereoCalibrate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 标定立体相机设置。此函数找到两个相机各自的内参以及两个相机之间的外参。 cv::stereoCalibrate 是 OpenCV 中用于立体相机标定的函数。它通过一…

《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…

从零搭建一个Vue3 + Typescript的脚手架——day1

1.开发环境搭建 (1).配置vite vite简介 Vite 是一个由尤雨溪开发的现代化前端构建工具&#xff0c;它利用了浏览器对 ES 模块的原生支持&#xff0c;极大地提升了开发服务器的启动速度和热更新效率。Vite 不仅适用于 Vue.js&#xff0c;还支持 React、Svelte 等多种框架&…

minio https配置

minio启动时候指定数据目录,配置文件&#xff0c;密钥文件目录&#xff0c;环境文件 1.创建minio用户,专门用于服务启动的 groupadd -r minio-user useradd -M -r -g minio-user minio-user 2.在当前用户目录下创建minio目录&#xff0c;存储minio相关文件 mkdir minio 在mini…

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…

Rust 游戏开发框架指南

Rust 游戏开发框架指南 主流游戏引擎 1. Bevy 最受欢迎的 Rust 游戏引擎之一&#xff0c;基于 ECS&#xff08;实体组件系统&#xff09;架构。 特点&#xff1a; &#x1f680; 高性能 ECS 系统&#x1f4e6; 热重载支持&#x1f3a8; 现代渲染器&#x1f50a; 内置音频系…

C# Linq 查询

1.Linq 查询表达式基础 Linq 查询应用程序始终将源数据视为 IEnumerable<T> 或 IQueryable<T> 集合。 LINQ查询表达式包含8个基本子句,分别为from、select、group、where、orderby、join、let和into。 子 句备注from指定数据源和范围变量select指定当执行查询…

leetcode 面试经典 150 题:汇总区间

链接汇总区间题序号228题型数组解法一次遍历法难度简单熟练度✅✅✅ 题目 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属…

使用Go语言中的Buffer实现高性能处理字节和字符串

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

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

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