鸿蒙编程江湖:并发编程基础与鸿蒙中的任务并发

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

并发编程是指在同一时间段内处理多个任务的能力。并发编程可以提高应用程序的响应速度和效率,并避免耗时任务阻塞主线程,导致应用程序卡顿。

鸿蒙系统提供了多种并发模型,其中 TaskPool 和 Worker 是两种常用的并发能力。

  • TaskPool:TaskPool 是一个多线程运行环境,它提供了任务的执行、取消、优先级设置等功能。TaskPool 适用于独立任务,例如计算密集型任务、I/O 密集型任务等。
  • Worker:Worker 是一个可以长时间运行的后台线程,它支持与宿主线程之间的消息传递。Worker 适用于长时间运行的任务,例如后台数据处理、模型训练等。

@Concurrent 装饰器的用途与用法

在鸿蒙系统中,@Concurrent 装饰器用于声明并校验并发函数。从 API version 9 开始,支持使用 @Concurrent 装饰器声明并校验并发函数。
装饰器用法

less 复制代码
@Concurrentfunction myConcurrentFunction() {
  // 并发函数的代码
}

装饰器参数 :无。
使用场景 :仅支持在 Stage 模型的工程中使用。仅支持在 .ets 文件中使用。
装饰的函数类型 :允许标注 async 函数或普通函数。禁止标注 generator、箭头函数、method。不支持类成员函数或者匿名函数。
装饰的函数内的变量类型 :允许使用 local 变量、入参和通过 import 引入的变量。禁止使用闭包变量。
装饰的函数内的返回值类型:支持的类型请查序列化支持类型。

并发函数的声明与校验

并发函数是指可以在 TaskPool 中执行的函数。声明并发函数需要使用 @Concurrent 装饰器进行修饰,并进行必要的校验。
示例

typescript 复制代码
import { taskpool } from '@kit.ArkTS';
@Concurrentfunction add(num1: number, num2: number): number {
  return num1 + num2;
}

并发函数注意事项

  • 并发函数必须使用 @Concurrent 装饰器进行修饰。
  • 并发函数的入参和返回值类型必须支持序列化。
  • 并发函数内不允许使用闭包变量。
  • 并发函数执行时间不能超过 3 分钟。

Actor 并发模型与内存共享模型的对比

Actor 并发模型

  • 每个 Actor 都拥有独立的内存空间。
  • Actor 之间通过消息传递机制进行通信。
  • Actor 并发模型避免了内存竞争问题。
    内存共享模型
  • 多个线程共享同一块内存空间。
  • 线程访问内存需要抢占锁。
  • 内存共享模型容易出现数据竞争问题。
    对比
  • Actor 并发模型更适合并发编程,因为它避免了内存竞争问题。
  • 内存共享模型更适合共享内存的场景,例如多线程计算。

TaskPool 中执行并发函数的基本示例

以下是一个简单的示例,演示如何在 TaskPool 中执行并发函数:

typescript 复制代码
import { taskpool } from '@kit.ArkTS';
@Concurrentfunction 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 装饰器的使用方法。使用并发编程可以有效地提高应用程序的响应速度和效率,并避免耗时任务阻塞主线程。希望本文能够帮助您掌握鸿蒙系统中的并发编程技术,并开发出更优秀的鸿蒙应用。

相关推荐
特立独行的猫a1 小时前
鸿蒙PC平台三方库移植实战:以libogg库移植为例(附完整移植流程与工具链配置)
华为·harmonyos·三方库移植·鸿蒙pc·libogg
爱笑的眼睛111 小时前
深入理解HarmonyOS通知渠道与优先级设置:从基础到高级实践
华为·harmonyos
夏文强6 小时前
HarmonyOS开发者认证练习题-判断题
华为·harmonyos
Kisang.6 小时前
【HarmonyOS】ArkTS的多线程并发(下)——线程间通信对象的传递
华为·typescript·harmonyos·鸿蒙
柒儿吖10 小时前
Qt for HarmonyOS 3D图片轮播组件开源鸿蒙开发实战
qt·3d·harmonyos
爱笑的眼睛1114 小时前
HarmonyOS分布式输入法开发:实现多设备无缝输入体验
华为·harmonyos
爱笑的眼睛1114 小时前
深入HarmonyOS打印服务:从基础到高级应用开发
华为·harmonyos
鸿蒙小白龙17 小时前
OpenHarmony内核开发实战手册:编译构建、HCK框架与性能优化
harmonyos·鸿蒙·鸿蒙系统·open harmony
穆雄雄17 小时前
Rust 程序适配 OpenHarmony 实践:以 sd 工具为例
开发语言·rust·harmonyos
╰つ栺尖篴夢ゞ21 小时前
HarmonyOS之多态样式stateStyles的使用
华为·harmonyos·statestyles·多态样式