鸿蒙中并行并发:Concurrency分析
并发(Concurrency)和并行(Parallelism)区别在哪里?
🧠 核心思想:一句话分清它俩
记住这个最经典的比喻:
-
并发(Concurrency): 一个人(一个CPU核心)交替地做多件事。
-
比如:你一边看电视,一边回微信消息。你其实是在快速地在“看电视”和“回消息”这两件事之间切换注意力,同一瞬间你只做了一件事。
-
-
并行(Parallelism): 多个人(多个CPU核心)同时地做多件事。
-
比如:你和你的室友,一个在炒菜,一个在煮饭,两人在同一时刻真正地同时进行。
-
核心区别:是否同时发生。 并发关心的是任务的处理方式(交替执行),并行关心的是任务的执行状态(同时执行)。
🍳 深入聊聊“并发”(Concurrency)
为什么需要并发?
因为世界不是单线程的。在程序中,我们经常会遇到一些需要“等待”的任务,比如:
-
从网络下载一张图片
-
从数据库读取大量数据
-
等待用户点击一个按钮
如果你的程序是“单线程”的(就像一个人只做一件事),那么在下载图片时,整个界面就会“卡住”,用户点什么都没反应,体验极差。这就像你去餐厅点餐,厨师必须等菜全部做完才能接待下一位客人,效率极低。
并发的解决方案:
让一个人(主线程)负责接待客人(响应用户操作,保持界面流畅),然后派几个助手(后台线程) 去后厨做那些耗时的菜(网络请求、数据库操作)。虽然CPU核心可能只有一个,但它通过快速切换,让所有任务都看起来在同时推进。
在Android里的例子:
你刷朋友圈(主线程,UI线程),需要加载九张图。如果都在主线程下载,界面就会卡住。所以,程序会创建多个并发任务(比如用 AsyncTask, ThreadPool, Kotlin协程),让它们在后台默默下载,下载完后再把结果“抛回”给主线程显示出来。这些下载任务在单核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倍!
-
并行的必要条件:
-
多核CPU硬件支持。 一个CPU核心无法实现真正的并行。
-
任务可以被拆分。 不是所有任务都能像上面那样完美拆分。
在Android里的例子:
对一张超高清图片进行复杂的滤镜处理(比如高斯模糊)。这个计算任务很重,就可以把它拆分成若干个小块(比如按像素行),丢到线程池里,让多个CPU核心同时处理不同的块,处理完再合并,能极大提升速度。
🔄 总结与关系:一张图看懂
| 特性 | 并发(Concurrency) | 并行(Parallelism) |
|---|---|---|
| 核心目标 | 提高程序响应能力和资源利用率 | 提高程序计算速度和吞吐量 |
| 关注点 | 任务的结构与处理方式 | 任务的执行与计算过程 |
| 硬件要求 | 不必须多核CPU(单核也可并发) | 必须多核CPU或多台机器 |
| 本质 | 逻辑上的同时发生(交替执行) | 物理上的同时发生 |
| 好比 | 单CPU时间片轮转 | 多CPU同时计算 |
| 关系 | 并行是并发的一种理想特例。并发是一个更广泛的概念,它包含了“交替执行”和“同时执行”两种可能。 |
它们的关系是:
-
并行一定是并发的(因为多个同时执行的任务,本身就构成了并发)。
-
但并发不一定是并发的(在单核上,你只能并发,无法并行)。
你可以把并发看作是一种程序设计模式,它让程序有能力处理多个任务。而并行是一种计算资源,它利用多核硬件来加速这些任务的执行
在鸿蒙中
是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。您可以使用任务池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在该状态下的详细信息







浙公网安备 33010602011771号