DEV Community

SameX
SameX

Posted on

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

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

并发编程是指在同一时间段内处理多个任务的能力。并发编程可以提高应用程序的响应速度和效率,并避免耗时任务阻塞主线程,导致应用程序卡顿。
鸿蒙系统提供了多种并发模型,其中 TaskPool 和 Worker 是两种常用的并发能力。

  • TaskPool:TaskPool 是一个多线程运行环境,它提供了任务的执行、取消、优先级设置等功能。TaskPool 适用于独立任务,例如计算密集型任务、I/O 密集型任务等。
  • Worker:Worker 是一个可以长时间运行的后台线程,它支持与宿主线程之间的消息传递。Worker 适用于长时间运行的任务,例如后台数据处理、模型训练等。 ### @Concurrent 装饰器的用途与用法 在鸿蒙系统中,@Concurrent 装饰器用于声明并校验并发函数。从 API version 9 开始,支持使用 @Concurrent 装饰器声明并校验并发函数。 装饰器用法
@Concurrent
function myConcurrentFunction() {
  // 并发函数的代码
}
Enter fullscreen mode Exit fullscreen mode

装饰器参数:无。
使用场景:仅支持在 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;
}
Enter fullscreen mode Exit fullscreen mode

并发函数注意事项

  • 并发函数必须使用 @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%');
  }
}
Enter fullscreen mode Exit fullscreen mode

这段代码定义了一个名为 Index 的组件,并在组件中显示了一条文本消息 "Hello World"。点击按钮会执行 concurrentFunc 函数,该函数创建一个并发任务并执行它。任务完成后,会在控制台输出结果。

总结

通过以上介绍,您可以了解到鸿蒙系统中的并发模型和 @Concurrent 装饰器的使用方法。使用并发编程可以有效地提高应用程序的响应速度和效率,并避免耗时任务阻塞主线程。希望本文能够帮助您掌握鸿蒙系统中的并发编程技术,并开发出更优秀的鸿蒙应用。

Top comments (0)