鸿蒙中并行并发:Concurrency分析

 并发(Concurrency)和并行(Parallelism)区别在哪里?

🧠 核心思想:一句话分清它俩

记住这个最经典的比喻:

  • 并发(Concurrency): 一个人(一个CPU核心)交替地做多件事。

    • 比如:你一边看电视,一边回微信消息。你其实是在快速地在“看电视”和“回消息”这两件事之间切换注意力,同一瞬间你只做了一件事。

  • 并行(Parallelism): 多个人(多个CPU核心)同时地做多件事。

    • 比如:你和你的室友,一个在炒菜,一个在煮饭,两人在同一时刻真正地同时进行。

核心区别:是否同时发生。 并发关心的是任务的处理方式(交替执行),并行关心的是任务的执行状态(同时执行)。

🍳 深入聊聊“并发”(Concurrency)

为什么需要并发?
因为世界不是单线程的。在程序中,我们经常会遇到一些需要“等待”的任务,比如:

  • 从网络下载一张图片

  • 从数据库读取大量数据

  • 等待用户点击一个按钮

如果你的程序是“单线程”的(就像一个人只做一件事),那么在下载图片时,整个界面就会“卡住”,用户点什么都没反应,体验极差。这就像你去餐厅点餐,厨师必须等菜全部做完才能接待下一位客人,效率极低。

并发的解决方案:
让一个人(主线程)负责接待客人(响应用户操作,保持界面流畅),然后派几个助手(后台线程) 去后厨做那些耗时的菜(网络请求、数据库操作)。虽然CPU核心可能只有一个,但它通过快速切换,让所有任务都看起来在同时推进。

在Android里的例子:
你刷朋友圈(主线程,UI线程),需要加载九张图。如果都在主线程下载,界面就会卡住。所以,程序会创建多个并发任务(比如用 AsyncTaskThreadPoolKotlin协程),让它们在后台默默下载,下载完后再把结果“抛回”给主线程显示出来。这些下载任务在单核CPU上也是可以并发执行的。

并发带来的挑战:

  • 竞态条件(Race Condition): 多个任务可能同时竞争修改同一个数据。比如,你和室友共用一个钱包,你们都看到有100元,你取80,他取50,两个操作几乎同时发生,结果可能钱包变成-30元,这显然错了。

  • 解决方案: 加“锁”(Lock)。就像上厕所要锁门,一个人操作钱包时,先“锁”上,操作完再打开,另一个人才能操作

⚡️ 深入聊聊“并行”(Parallelism)

为什么需要并行?
为了极致的速度!当任务非常繁重,且可以拆分时,就用并行。

  • 任务: 计算1到1亿所有数字的和。

  • 单核做法: 一个人从1加到1亿。

  • 并行做法(四核CPU): 把任务拆成四份:

    • 核心1计算 1 到 2500万

    • 核心2计算 2500万到5000万

    • 核心3计算 5000万到7500万

    • 核心4计算 7500万到1亿
      最后,把四个结果加起来。速度理论上接近原来的4倍!

并行的必要条件:

  1. 多核CPU硬件支持。 一个CPU核心无法实现真正的并行。

  2. 任务可以被拆分。 不是所有任务都能像上面那样完美拆分。

在Android里的例子:
对一张超高清图片进行复杂的滤镜处理(比如高斯模糊)。这个计算任务很重,就可以把它拆分成若干个小块(比如按像素行),丢到线程池里,让多个CPU核心同时处理不同的块,处理完再合并,能极大提升速度。

🔄 总结与关系:一张图看懂

特性 并发(Concurrency) 并行(Parallelism)
核心目标 提高程序响应能力资源利用率 提高程序计算速度吞吐量
关注点 任务的结构与处理方式 任务的执行与计算过程
硬件要求 不必须多核CPU(单核也可并发) 必须多核CPU或多台机器
本质 逻辑上的同时发生(交替执行) 物理上的同时发生
好比 单CPU时间片轮转 多CPU同时计算
关系 并行是并发的一种理想特例。并发是一个更广泛的概念,它包含了“交替执行”和“同时执行”两种可能。  

它们的关系是:

  • 并行一定是并发的(因为多个同时执行的任务,本身就构成了并发)。

  • 但并发不一定是并发的(在单核上,你只能并发,无法并行)。

你可以把并发看作是一种程序设计模式,它让程序有能力处理多个任务。而并行是一种计算资源,它利用多核硬件来加速这些任务的执行

在鸿蒙中

任务池(TaskPool)是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。您可以使用任务池API创建后台任务(Task),并对所创建的任务进行如任务执行、任务取消的操作。

DevEco Profiler提供的Concurrency场景分析能力,帮助开发者针对并行并发场景,录制并行并发关键数据,分析Task的生命周期、吞吐量、耗时等性能问题。Concurrency模板支持展示ArkTS异步接口、NAPI异步接口、TaskPool、FFRT并发模型相关信息,并集成ArkTS Callstack、Callstack、Process信息,支持用户从Task生命周期关联到具体调用栈信息,方便用户定位并行并发性能问题。

查看Task统计信息

1:选择展开某个泳道,可以用options下拉框筛选不同进程。

编辑2:框选子泳道中某段时间范围,详情区会出现该时段内,泳道对应执行状态下,并行并发任务的统计信息。

3:点击Task Name的跳转按钮可跳转到对应的Task泳道

编辑

查看某一个Task的所有状态

选择展开某个泳道,可以用options下拉框筛选不同进程

编辑

  • 框选子泳道中某段时间范围,可以看到该Task在框选时间范围内的任务状态。

  • 点击Task Name的跳转按钮可跳转到对应线程的泳道,可查看在该Task执行时间范围内,trace文件的打点信息,反映的是线程该时段内的函数执行情况。

编辑展开Async ArkTS泳道,可单独查看ArkTS异步调用任务详情

编辑

查看Task的某个状态

点击Task子泳道的某个执行节点,Details详情区里会出现task在该状态下的详细信息

编辑

华为开发者学堂

posted @ 2025-08-24 18:52  大雷神  阅读(31)  评论(0)    收藏  举报