首页 > 编程语言 >鸿蒙编程江湖:并发编程基础与鸿蒙中的任务并发

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

时间:2024-10-25 12:58:31浏览次数:4  
标签:函数 鸿蒙 Concurrent taskpool 编程 并发 TaskPool

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

标签:函数,鸿蒙,Concurrent,taskpool,编程,并发,TaskPool
From: https://www.cnblogs.com/samex/p/18502283

相关文章

  • Node.js和Python在服务器端编程上有什么不同
    Node.js和Python在服务器端编程上有以下不同:1.设计哲学不同;2.性能不同;3.库支持和框架不同;4.同步/异步处理不同;5.语法简洁性不同;6.用途和适用场景不同。具体来说,Node.js基于事件驱动和非阻塞I/O模型,优于高并发处理,而Python则以简洁易读著称,广泛应用于科学计算、人工智能等领域。......
  • 触觉智能赴南方科技大学进行Purple Pi OH开源鸿蒙开发板培训圆满完成!
    10月19日,深圳触觉智能科技有限公司来到了深圳南方科技大学电子信息实验教学示范中心(以下简称触觉智能和南科大),为同学们培训鸿蒙开发板。该开发板型号PurplePiOH,搭载了瑞芯微RK3566芯片,类树莓派设计,是Laval官方社区主荐的一款鸿蒙开发主板。据实验教学示范中心吴老师介绍,自......
  • 鸿蒙开发:什么是ArkTS语言
    ArkTS(也称为ArkTypeScript)是HarmonyOS的主力应用开发语言。面向万物互联时代,华为提出了“一次开发多端部署、可分可合自由流转、统一生态原生智能”三大应用与服务开发理念。针对多设备、多入口、服务可分可合等特性,华为提供了多种能力协助开发者降低开发门槛。HarmonyOS......
  • unix网络编程:解决小型聊天室的用户私发消息问题
    今天老师布置了一个在线聊天室用户私发消息的问题思路:在服务端的用户链表中找到要私发的用户名,用其节点里的套接字号发消息,就可以达到私发的效果。运行效果:可以看到,Tom给Bill、Lily群发一个问候消息,Lily私发消息回应Tom。客户端代码:#include<stdio.h>#include<stri......
  • 鸿蒙网络编程系列35-通过数据包结束标志解决TCP粘包问题
    1.TCP数据传输粘包简介在本系列的第6篇文章《鸿蒙网络编程系列6-TCP数据粘包表现及原因分析》中,我们演示了TCP数据粘包的表现,如图所示:随后解释了粘包背后的可能原因,并给出了解决TCP传输粘包问题的两种思路,其中一种就是指定数据包结束标志,本节将通过一个示例演示这种思路......
  • 为什么有些编程语言不建议用下划线作为标识符开头?标识符的特殊字符。为什么不指定编
    为什么有些编程语言不建议用下划线作为标识符开头?C/C++中两个下划线开头的标识符可能是预留给运行时库的保留字。写代码的时候,就建议最好不要用下划线开头的标识符,避免冲突。最怕的是,编译器没提示错误,运行时产生奇怪的结果。......
  • 编程语言有哪些分类?C语言和其他编程语言的区别?到底什么是高级语言,什么是低级语言?C
    编程语言有哪些分类?编程语言发展有打孔卡片、机器语言、汇编语言和高级语言这几种形态。高级语言对于程序员更友好,发展的形态五花八门。从编程方式看,有命令式、函数式和逻辑式三种。命令式以常见的C/C++/Java/C#/Py......
  • 鸿蒙开发融云demo消息未读数
    鸿蒙开发融云demo消息未读数跟着我一步步搭建带界面的融云demo,这次是要显示未读数,未读数有两个,一个是消息列表的未读数,一个是主页消息tab上的未读数。一、消息列表的未读数先看下效果图:关键代码如下:if(this.chatItem.unreadMessageCount>0||this.customUnReadCou......
  • 网络编程(Day34)
    一、学习内容网络发展历史发展阶段1.APRAnet阶段---冷战产物2.TCP/IP协议阶段--只有TCP和IP两个协议3.osi开放系统互联模型4.TCP/IP协议族(重要)5.量子通信(可能)TCP/IP两个协议阶段概念在计算机网络中,要做到有条不紊的交换数据,需要遵循一些事先约定好的规则......
  • 如何在保证 ACID 原则的同时提高数据库的并发性能?
    在保证ACID原则的同时提高数据库的并发性能是一个复杂但至关重要的任务。以下是一些方法和策略,可以在遵循ACID原则的基础上提升数据库的并发性能:1.优化事务设计批量操作:将多个相关的操作放入一个事务中,可以减少事务的数量,从而降低回滚和恢复的成本。这有助于提高性能,但需要......