鸿蒙编程江湖:并发编程基础与鸿蒙中的任务并发
本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。
并发编程是指在同一时间段内处理多个任务的能力。并发编程可以提高应用程序的响应速度和效率,并避免耗时任务阻塞主线程,导致应用程序卡顿。
鸿蒙系统提供了多种并发模型,其中 TaskPool 和 Worker 是两种常用的并发能力。
- TaskPool:TaskPool 是一个多线程运行环境,它提供了任务的执行、取消、优先级设置等功能。TaskPool 适用于独立任务,例如计算密集型任务、I/O 密集型任务等。
- Worker:Worker 是一个可以长时间运行的后台线程,它支持与宿主线程之间的消息传递。Worker 适用于长时间运行的任务,例如后台数据处理、模型训练等。
@Concurrent 装饰器的用途与用法
在鸿蒙系统中,@Concurrent
装饰器用于声明并校验并发函数。从 API version 9 开始,支持使用 @Concurrent
装饰器声明并校验并发函数。
装饰器用法:
@Concurrent
function myConcurrentFunction() {
// 并发函数的代码
}
装饰器参数:无。
使用场景:仅支持在 Stage 模型的工程中使用。仅支持在 .ets 文件中使用。
装饰的函数类型:允许标注 async 函数或普通函数。禁止标注 generator、箭头函数、method。不支持类成员函数或者匿名函数。
装饰的函数内的变量类型:允许使用 local 变量、入参和通过 import 引入的变量。禁止使用闭包变量。
装饰的函数内的返回值类型:支持的类型请查序列化支持类型。
并发函数的声明与校验
并发函数是指可以在 TaskPool 中执行的函数。声明并发函数需要使用 @Concurrent
装饰器进行修饰,并进行必要的校验。
示例:
import { taskpool } from '@kit.ArkTS';
@Concurrent
function add(num1: number, num2: number): number {
return num1 + num2;
}
并发函数注意事项:
- 并发函数必须使用
@Concurrent
装饰器进行修饰。 - 并发函数的入参和返回值类型必须支持序列化。
- 并发函数内不允许使用闭包变量。
- 并发函数执行时间不能超过 3 分钟。
Actor 并发模型与内存共享模型的对比
Actor 并发模型:
- 每个 Actor 都拥有独立的内存空间。
- Actor 之间通过消息传递机制进行通信。
- Actor 并发模型避免了内存竞争问题。
内存共享模型: - 多个线程共享同一块内存空间。
- 线程访问内存需要抢占锁。
- 内存共享模型容易出现数据竞争问题。
对比: - Actor 并发模型更适合并发编程,因为它避免了内存竞争问题。
- 内存共享模型更适合共享内存的场景,例如多线程计算。
TaskPool 中执行并发函数的基本示例
以下是一个简单的示例,演示如何在 TaskPool 中执行并发函数:
import { taskpool } from '@kit.ArkTS';
@Concurrent
function add(num1: number, num2: number): number {
return num1 + num2;
}
async function concurrentFunc() {
try {
let task: taskpool.Task = new taskpool.Task(add, 1, 2);
console.info("taskpool res is: " + await taskpool.execute(task));
} catch (e) {
console.error("taskpool execute error is: " + e);
}
}
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() => {
concurrentFunc();
})
.width('100%');
}
}
.height('100%');
}
}
这段代码定义了一个名为 Index
的组件,并在组件中显示了一条文本消息 "Hello World"。点击按钮会执行 concurrentFunc
函数,该函数创建一个并发任务并执行它。任务完成后,会在控制台输出结果。
总结
通过以上介绍,您可以了解到鸿蒙系统中的并发模型和 @Concurrent
装饰器的使用方法。使用并发编程可以有效地提高应用程序的响应速度和效率,并避免耗时任务阻塞主线程。希望本文能够帮助您掌握鸿蒙系统中的并发编程技术,并开发出更优秀的鸿蒙应用。