鸿蒙5.0开发【应用并发设计整体架构(并发模型与业界模型的差异)】架构
ArkTS是HarmonyOS APP的开发语言,它在保持TypeScript(简称TS)基本语法风格的基础上,一方面规范强化静态检查提升开发者代码的规范性;另一方面基于TypeScript增强了一些特性提升开发体验和执行效率,尤其是在并发能力上的提升。
概述
ArkTS是HarmonyOS APP的开发语言,它在保持TypeScript(简称TS)基本语法风格的基础上,一方面规范强化静态检查提升开发者代码的规范性;另一方面基于TypeScript增强了一些特性提升开发体验和执行效率,尤其是在并发能力上的提升。
本文档主要面向HarmonyOS APP的设计人员或开发人员,介绍应用在并行任务方案设计过程中,可能会遇到的典型场景以及对应的推荐设计方案,同时给出了方案的关键点及参考案例。
典型业务场景
根据当前HarmonyOS APP开发过程中遇到的实际并发业务场景,总结提炼出如下典型场景,可供更多APP参考,设计其并发业务方案。
场景编号 | 场景分类 | 场景名称 | 简述 |
---|---|---|---|
1 | 并发能力选择 | 耗时任务并发执行 | 相对独立的耗时任务需要放到单独的子线程中执行,推荐TaskPool |
2 | 常驻任务并发执行 | 常驻的耗时任务需要放到单独的子线程中执行,推荐Worker | |
3 | 共享内存并发业务 | 开发常见的共享内存并发业务,推荐使用TaskPool和Worker的API进行开发 | |
4 | 长时任务并发执行 | 长时间运行的任务,不独占线程执行,推荐TaskPool长时任务 | |
5 | 并发任务管理 | 多任务关联执行(串行顺序依赖) | 有严格执行顺序的任务,不希望并发执行 |
6 | 多任务关联执行(树状依赖) | 待执行的任务存在依赖关系,等待被依赖执行完再调度 | |
7 | 多任务同步等待结果(任务组) | 多个关联的任务需要等待全部结果返回后再进行后续操作 | |
8 | 多任务优先级调度 | 不同任务设置不同的优先级 | |
9 | 任务延时调度 | 任务不希望立即执行,希望延时一定时间后调度 | |
10 | 线程间通信 | 同语言线程间通信(ArkTS内) | 介绍ArkTS线程间的通信机制 |
11 | 跨语言多线程通信(C++与ArkTS) | 介绍C++与ArkTS线程间的通信机制 | |
12 | 线程间模块共享(单例模式) | 介绍进程内单例场景的实现方式 | |
13 | 线程间不可变数据共享 | 介绍不可变数据共享场景的实现方式 | |
14 | 生产者与消费者模式 | 介绍生产者与消费者模式场景的实现方式 |
并发能力整体架构
并发能力概述
并发能力框架如下:
-
主线程: 执行UI业务、不耗时操作、单次I/O任务,与其他ArkTS线程共享系统I/O线程池,不阻塞当前ArkTS线程。
-
TaskPool 高并发任务池: 执行耗时任务,基于TaskPool封装任务执行的入口,可统计模块负载,开发者无需管理线程实例的生命周期。
-
Worker 线程: 执行常驻任务,CPU密集型、耗时任务,当前限制线程个数为64。
-
FFRT 任务池:
- 系统任务:系统分发到FFRT线程的业务,例如异步I/O任务等,开发者无需关注;
- 用户任务:开发者创建的C/C++耗时任务,支持负载均衡及线程生命周期管理等能力。
-
Pthread 线程: 采用C/C++开发的模块,需要后台运行或者耗时的ArkTS无关业务,不限制线程个数。
并发模型与业界模型的差异
共享内存并发模型
共享内存模型指的是采用线程和锁的并发模型,不同线程之间共享内存,通过锁来进行临界区保护。对于不同业务,如果包含I/O操作或者锁,为了业务不被阻塞,需要开启多个线程来执行不同的业务,线程情况如下图所示:
因此,应用上经常存在几百个线程,增加了调度开销和内存占用。
ArkTS并发模型
ArkTS采用了内存隔离的线程模型,不同线程之间通过消息通信,线程内无锁化运行。对于不同业务,其内部的I/O操作会由系统分发到后台的I/O任务池,不阻塞ArkTS上层逻辑,线程情况如下图所示:
异步I/O不阻塞ArkTS线程,同时TaskPool及I/O线程池由系统管理,提升能效。
ArkTS语言支持了TaskPool和Worker的并发能力,接下来简单介绍TaskPool和Worker的功能。
TaskPool的运作机制可参考[TaskPool简介],TaskPool提供了任务分发的入口,支持将任务分发到不同优先级的队列,TaskPool底层自动管理了一定数量的工作线程,会从队列获取任务执行。同时,工作线程会根据任务数量进行自动扩缩容,保证任务执行效率。TaskPool内部会根据任务量及当前线程数量,决定是否扩容或缩容,当任务较多时会扩容。线程的上限跟硬件核数相关,例如8核设备,线程数上限大概为7-15左右。
Worker的运作机制可参考[Worker简介],空任务的Worker线程的内存占用大约2MB左右,因此需要控制线程的数量,避免内存过大。
ArkTS与传统共享内存并行化的差异
通过上述并发模型的对比,可以看出在ArkTS中的异步I/O操作,会分发到I/O任务池中,不阻塞ArkTS语言的执行。而Java需要大量线程进行阻塞I/O操作,导致线程数较多。
其次,ArkTS采用内存隔离的并发模型,不能跨线程共享对象,需要进行线程间数据通信。而Java可以直接访问不同线程的对象,但是需要使用锁进行数据的线程安全保护。

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)