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

本文旨在深入探讨华为鸿蒙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 装饰器的使用方法。使用并发编程可以有效地提高应用程序的响应速度和效率,并避免耗时任务阻塞主线程。希望本文能够帮助您掌握鸿蒙系统中的并发编程技术,并开发出更优秀的鸿蒙应用。

相关推荐
熊猫钓鱼>_>14 小时前
碰一碰无网近场文件快传与断点续传【鸿蒙心迹】
华为·交互·harmonyos·arkts·鸿蒙·openharmony·鸿蒙心迹
hhhjhl20 小时前
开源鸿蒙平台 KMP_CMP 三方库「Clikt」适配全流程
华为·开源·harmonyos
熊猫钓鱼>_>21 小时前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc
Goway_Hui1 天前
【KMP for OpenHarmony】-- 在鸿蒙工程中使用 Apollo-Kotlin
华为·kotlin·harmonyos
正在走向自律1 天前
HarmonyOS 手机/平板远程控制 Windows 电脑实践指南
智能手机·电脑·harmonyos·todesk·远程工具
熊猫钓鱼>_>1 天前
鸿蒙 PC 三方库适配复盘:libfvad 1.0 —— 把 WebRTC VAD 做成能装进采集链路的静态库
服务器·开发语言·华为·harmonyos·openharmony·适配·鸿蒙pc
aqi001 天前
AI编程让鸿蒙开发电子书APP更加快捷
android·华为·harmonyos·鸿蒙·harmony
熊猫钓鱼>_>1 天前
鸿蒙PC高分屏与键鼠交互适配:DPI缩放、右键菜单一次讲清
开发语言·笔记·华为·ai编程·harmonyos·鸿蒙·鸿蒙心迹
Goway_Hui1 天前
【KMP for OpenHarmony】Cache4k 0.14.0 鸿蒙适配
华为·kotlin·harmonyos