当前位置: 首页 > news >正文

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# 中,通过异步编程,线程,任务和并行类库,可以灵活地实现并发和并行,满足不同应用场景的需求

相关文章:

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 # 安装支持的浏览器&#xff1a;cr, chromium, ff, firefox, wk 和 webkit3、接着在自己的项目下运行录制命令&#xff1a; playwright codegen…...

Linux查看日志命令

问题排查过程&#xff1a; 1. 评估问题现象是否是操作问题&#xff0c;还是服务bug&#xff0c;页面出异常信息是后端&#xff0c;没抛异常信息有可能是前端渲染问题&#xff0c;F12抓包看那个字段没有数据&#xff08;有时候需要前端帮忙确定是哪一个字段&#xff09;&#x…...

(8)ERC20详细介绍

ERC20 是以太坊上的一种代币标准&#xff08;同质化代币&#xff09;&#xff0c;由 Fabian Vogelsteller 在 2015 年提出。它定义了一组通用的接口和规则&#xff0c;使得开发者可以创建可互操作的代币。ERC20 代币在以太坊生态系统中非常流行&#xff0c;广泛应用于各种去中心…...

opencv projectPoints函数 computeCorrespondEpilines函数 undistortPoints函数

opencv projectPoints函数 cv::projectPoints 是 OpenCV 中用于将三维点投影到二维图像平面的函数。它通常用于计算在相机坐标系下的三维点在图像坐标系中的位置&#xff0c;考虑了相机的内参和外参。 函数原型 void cv::projectPoints(InputArray objectPoints,InputArray …...

springboot集成websocket实现实时大量数据,效率性能高

前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注一下&#xff01; 也许一个人独行&#xff0c;可以走的很快&#xff0c;但是一群人结伴而行&#xff0c;才能走的更远&#xff01;让我们在成长的道路上互相学习&…...

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…...

Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步

在 Windows 上的 MySQL 8.4.3 和 WSL&#xff08;Ubuntu&#xff09;的 MySQL 8.0.40 之间配置 主从同步&#xff08;Master-Slave Replication&#xff09; 的过程略有不同&#xff0c;因为两者的 MySQL 版本和环境存在差异。以下是详细步骤&#xff0c;帮助你完成跨平台的主从…...

【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)

&#xff1a; 羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?spm1010.2135.3001.5343 在本篇文章中&#xff0c;博主将带大家去学习所谓的…...

Sentinel配置流控规则详解

前言 在微服务架构中&#xff0c;流量控制&#xff08;Flow Control&#xff09;是保障服务稳定性的重要手段之一。Sentinel作为一款开源的流量控制、熔断降级Java库&#xff0c;以其丰富的应用场景和完善的监控能力&#xff0c;在微服务保护中扮演了重要角色。本文将详细介绍…...

解锁动态规划的奥秘:从零到精通的创新思维解析(6)

解锁动态规划的奥秘&#xff1a;从零到精通的创新思维解析&#xff08;6&#xff09; 前言&#xff1a; 在动态规划的众多问题中&#xff0c;多状态DP问题是一个非常重要的类别。它的难点在于如何设计合适的状态表示和转移方程&#xff0c;从而高效地解决问题。 多状态DP的核…...

Qwen2.5 3B、7B、14B在文本按照规范进行标准化改写任务上的表现

任务介绍&#xff1a;军事杂志方向资料标准化改写任务 1. 任务目标 本任务的目标是对军事杂志领域的非标准化资料进行改写&#xff0c;确保其符合军事文献的写作规范和标准格式。通过改写&#xff0c;保留原文的核心内容和信息&#xff0c;同时提升语言的准确性、简洁性和专业…...

Oracle报错ORA-01078、LRM-00109

虚拟机异常关机后&#xff0c;rac数据库备机无法启动数据库&#xff0c;报错如下 解决方法&#xff1a; 找到如下路径文件 执行&#xff1a; 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) 之快速入门教程(一)

哈喽大家好&#xff0c;欢迎来到虚拟化时代君&#xff08;XNHCYL&#xff09;&#xff0c;收不到通知请将我点击星标&#xff01;“ 大家好&#xff0c;我是虚拟化时代君&#xff0c;一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…...

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&#xff0c;以满足有效载荷动态模型要求 Ansys 子结构模型的优势 Ansys 子结构模型为从事大型装配体结构分析和仿真的工程师和分析师提供了多项优势。 这些模型通过将复杂结构划分为更小、更易于管理的子结构&#xff0c;可以…...

小哆啦的跳跃挑战:能否突破迷宫的极限?

小哆啦开始力扣每日一题的第六天 https://leetcode.cn/problems/jump-game/description/ 小哆啦的跳跃挑战&#xff1a;能否突破迷宫的极限&#xff1f; 第一阶段&#xff1a;小哆啦的初次尝试 —— 盲目跳跃 小哆啦刚进入跳跃之城&#xff0c;他决定采用一种非常直接的方法来…...

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常用的方法及开发中的使用场景

在前端开发中&#xff0c;Object 对象提供了许多常用的方法&#xff0c;这些方法帮助我们操作对象的属性和结构。以下是常用的 Object 方法及其功能简要说明&#xff1a; 对象常用的方法 1. 创建对象 Object.create(proto[, propertiesObject]) 创建一个具有指定原型对象和属性…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...