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

并发与并行

摘要:并发与并行是两个易混淆但本质不同的概念。并发指多个任务执行过程重叠,关注共享状态管理;并行则是将任务拆分为子任务同时执行,旨在提升硬件性能。并发系统需满足正确性、安全性和活性等特性,实现时需解决数据共享和I/O资源共享问题。并行通过任务拆分可显著提升执行效率,常见于多核处理器和显卡等场景。单核处理器通过上下文切换模拟并发,而多核处理器能真正实现并行处理。理解二者的区别有助于在软件设计中做出合理决策。

目录

并发与并行

深入理解并发

并发的层级

并发系统的特性

并发系统的实现障碍

示例:获取网页加载耗时

main.py

输出结果

什么是并行?

并行的必要性

实现并发 / 并行的处理器基础

单核处理器

多核处理器

取指 - 译码 - 执行周期


并发与并行

并发和并行均与多线程程序相关,但人们对二者的异同点一直存在诸多混淆。核心问题在于:并发是否等同于并行?尽管这两个术语看似相近,但答案是否定的,二者并非同一概念。那么,二者的根本区别究竟是什么?

简单来说,并发处理的是不同线程对共享状态的访问管理,而并行则是利用多个 CPU 或其核心来提升硬件性能。

深入理解并发

并发指两个任务的执行过程出现重叠,即一个应用程序能同时推进多个任务的执行。我们可以通过图示理解:多个任务在同一时间内都处于推进状态。

并发的层级

从编程角度来看,并发主要分为三个重要层级:

  1. 底层并发该层级需要显式使用原子操作,无法用于应用程序开发,因为这种方式极易出错且难以调试,Python 也不支持此类并发。
  2. 中层并发无需显式使用原子操作,而是采用显式锁机制。Python 及其他编程语言均支持该层级的并发,也是应用程序开发人员最常使用的并发方式。
  3. 高层并发既不使用显式原子操作,也不使用显式锁。Python 提供了concurrent.futures模块来支持高层并发。

并发系统的特性

一个程序或并发系统要保证正确性,必须满足以下特性,其中与系统终止相关的特性如下:

  1. 正确性指程序或系统必须输出预期的正确结果。简单来说,系统需将程序的初始状态正确映射到最终状态。
  2. 安全性指程序或系统必须始终处于正常安全的状态,绝不会执行错误操作。
  3. 活性指程序或系统必须持续推进执行,最终达到某个期望的状态。
  4. 并发系统的执行主体这是并发系统的通用特性:系统中存在多个进程和线程,它们同时运行,各自推进自身任务的执行,这些进程和线程被称为并发系统的执行主体
  5. 并发系统的资源执行主体必须借助内存、磁盘、打印机等资源来完成自身任务。
  6. 一套既定规则每个并发系统都必须制定一套规则,明确执行主体需要完成的任务类型及各任务的执行时序,这些任务包括获取锁、共享内存、修改状态等。

并发系统的实现障碍

开发人员在实现并发系统时,必须考虑以下两个关键问题,它们也是并发系统的主要实现障碍:

  1. 数据共享这是实现并发系统的核心问题:多个线程或进程之间的数据共享。开发人员必须通过锁机制保护共享数据,确保所有对共享数据的访问都按顺序执行,同一时间只有一个线程或进程能访问共享数据。若多个线程或进程同时尝试访问同一共享数据,除其中一个外,其余都会被阻塞并处于空闲状态。也就是说,锁生效时,同一时间只能使用一个进程或线程。针对这一障碍,有以下几种简易解决办法:

    • 限制数据共享:最直接的方案是不共享任何可变数据,此时无需使用显式锁,因数据共享产生的并发障碍也会随之解决。
    • 借助数据结构:并发进程往往需要同时访问同一数据,除显式锁外,还可使用支持并发访问的数据结构。例如 Python 的queue模块提供了线程安全的队列,也可使用multiprocessing.JoinableQueue类实现基于多进程的并发。
    • 传递不可变数据:若当前使用的并发队列等数据结构不合适,可直接传递不可变数据,无需为其加锁。
    • 传递只读可变数据:若业务需要传递可变数据而非不可变数据,可传递只读的可变数据
  2. I/O 资源共享实现并发系统的另一重要问题是线程或进程对 I/O 资源的使用。当一个线程或进程长时间占用 I/O 资源,其他线程 / 进程只能处于空闲状态时,就会出现该问题,这类障碍在 I/O 密集型应用中尤为常见。以浏览器请求网页为例:网页请求属于典型的 I/O 密集型操作,若数据的请求速率低于消费速率,并发系统中就会出现 I/O 障碍。

示例:获取网页加载耗时

以下 Python 脚本用于请求一个网页,并统计网络获取该网页的耗时:

main.py
import urllib.request import time ts = time.time() req = urllib.request.urlopen('https://www.tutorialspoint.com') pageHtml = req.read() te = time.time() print("页面获取耗时:{} 秒".format(te - ts))
输出结果

运行上述脚本后,可得到如下页面获取耗时:

plaintext

页面获取耗时:0.15655970573425293 秒

可见,单次获取网页的耗时就超过了 0.1 秒。若需要获取数千个不同的网页,网络耗时会大幅增加,这也体现了并发 / 并行优化的必要性。

什么是并行?

并行可定义为:将一个任务拆分为多个子任务,使这些子任务能同时被处理的设计思路。这与前文所说的并发形成区别 —— 并发是多个事件在同一时间发生,而并行是对单个任务的拆分与同步处理。

我们可通过图示理解:一个任务被拆分为多个子任务,所有子任务并行执行。

为进一步区分并发与并行,可分为以下四种情况:

  1. 仅并发,非并行:应用程序能同时处理多个任务,但不会将任务拆分为子任务,仅通过任务切换实现 “同时推进”。
  2. 仅并行,非并发:应用程序同一时间只处理一个任务,但会将该任务拆分为多个子任务,让子任务并行执行。
  3. 非并发,也非并行:应用程序同一时间只处理一个任务,且不会将任务拆分为子任务,完全按顺序执行。
  4. 既并发,又并行:应用程序能同时处理多个任务,且会将每个任务拆分为子任务,让所有子任务并行执行。

并行的必要性

我们可将子任务分配到单个 CPU 的多个核心,或网络中的多台计算机上,以此实现并行。理解并行的必要性,可参考以下几点:

  1. 提升代码执行效率:通过并行,代码能高效运行。将同一代码拆分后并行执行,可大幅节省时间。
  2. 比串行计算更快:串行计算受物理和实际条件的限制,无法无限提升计算速度,而并行计算解决了这一问题,能提供远快于串行计算的结果。
  3. 缩短程序执行时间:并行处理能有效减少程序代码的整体执行时间。

现实中的并行案例:计算机的显卡是体现并行处理强大能力的典型例子。显卡拥有数百个独立的处理核心,这些核心可独立运行、同时执行任务,正因如此,我们才能流畅运行大型应用程序和游戏。

实现并发 / 并行的处理器基础

了解了并发、并行的概念及二者的区别后,还需掌握其运行的硬件系统知识 —— 这能帮助我们在软件设计时做出合理决策。处理器主要分为以下两类:

单核处理器

单核处理器在任意给定时间内,只能执行一个线程。这类处理器通过上下文切换机制,保存某个线程在特定时间的所有必要信息,后续再恢复这些信息继续执行。上下文切换能让处理器在一秒内推进多个线程的执行,从外部看,系统仿佛在同时处理多个任务。

单核处理器的优势:功耗更低,且多个核心间无需复杂的通信协议。单核处理器的劣势:运行速度受限,无法适配大型应用程序。

多核处理器

多核处理器拥有多个独立的处理单元,即核心。这类处理器无需上下文切换机制,因为每个核心都具备执行存储指令序列所需的全部资源。

取指 - 译码 - 执行周期

多核处理器的每个核心都遵循取指 - 译码 - 执行(Fetch-Decode-Execute)周期执行指令,该周期分为三个步骤:

  1. 取指:周期的第一步,从程序内存中获取待执行的指令。
  2. 译码:将刚获取的指令转换为一系列信号,触发 CPU 的其他组件工作。
  3. 执行:周期的最后一步,执行经过取指和译码的指令,并将执行结果存储到 CPU 寄存器中。

多核处理器的优势:执行速度远快于单核处理器,适合运行大型应用程序。多核处理器的劣势:多个核心间的通信协议复杂,且功耗远高于单核处理器。

http://www.jsqmd.com/news/465674/

相关文章:

  • 系统与内存架构
  • OpenClaw,什么是‘skills‘或‘插件‘?安装完基础版后还需要装什么?
  • 安装OpenClaw时,‘claw install browser‘这条命令是干什么用的?
  • 安装OpenClaw时,出现乱码或报错,看不懂怎么办?
  • 安装OpenClaw需要用到Docker吗?
  • 安装OpenClaw时,腾讯云、阿里云提供的一键安装方案是什么?
  • Java基础面试题拷打(3)
  • JavaScript Temporal: 九年修正时间处理难题
  • 2026年质量好的过滤阀厂家推荐:台州减压阀厂家信誉综合参考 - 行业平台推荐
  • web学习第一课,认识web
  • AI Agent 系统必备:三种子 Agent 模式,让你的智能体真正“能干活”
  • AI Agent 终于能“自己清内存”了:Deep Agents 自主上下文压缩实战
  • 2026年质量好的新乡振动筛厂家推荐:振动筛分机厂家用户好评推荐 - 行业平台推荐
  • 2026年知名的测温球阀厂家推荐:外丝活接球阀厂家实力与用户口碑参考 - 行业平台推荐
  • 2026年比较好的提升机厂家推荐:垂直提升机/不锈钢提升机/新乡振动提升机厂家推荐与采购指南 - 行业平台推荐
  • 2026年口碑好的工厂蔬菜配送公司推荐:东莞蔬菜配送/食堂蔬菜配送/蔬菜配送供应商厂家推荐哪家好 - 行业平台推荐
  • 2026年知名的生鲜配送工厂推荐:东莞食品生鲜配送工厂直供哪家专业 - 行业平台推荐
  • 2026高效之选:沧州保温钢管生产厂家/钢套钢蒸汽保温管厂家哪家好?聚氨酯保温钢管厂家推荐 - 栗子测评
  • 揭秘9款冷门AI论文神器:一键生成初稿,AIGC率低至7% - 麟书学长
  • NineData社区版:免费+本地部署,满足数据库DevOps、复制与对比的数据库管理平台
  • Harmonyos应用实例65. 三位数乘两位数:网格计算法
  • Harmonyos应用实例66. 平行与垂直:光线射击游戏
  • 外贸GEO优化:亲测3家机构,效果复盘
  • Harmonyos应用实例67. 平行四边形和梯形:图形变变变
  • Harmonyos应用实例68. 除数是两位数的除法:试商大冒险
  • Harmonyos应用实例69. 条形统计图:智能生成器
  • Harmonyos应用实例63. 角的度量:虚拟量角器
  • Harmonyos应用实例64. 角的分类:时针旋转台
  • Python基于flask的美团餐饮商户点评管理与数据分析系统
  • OpenClaw Token 消耗优化:模型选择与配置调优完整方案