0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HarmonyOS如何使用异步并发能力进行开发

王程 来源:jf_75796907 作者:jf_75796907 2024-02-18 09:18 次阅读

一、并发概述

并发是指在同一时间段内,能够处理多个任务的能力。为了提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰,HarmonyOS系统提供了异步并发和多线程并发两种处理策略。

​ ● 异步并发是指异步代码在执行到一定程度后会被暂停,以便在未来某个时间点继续执行,这种情况下,同一时间只有一段代码在执行。

​ ● 多线程并发允许在同一时间段内同时执行多段代码。在主线程继续响应用户操作和更新UI的同时,后台也能执行耗时操作,从而避免应用出现卡顿。

并发能力在多种场景中都有应用,其中包括单次I/O任务、CPU密集型任务、I/O密集型任务和同步任务等。开发者可以根据不同的场景,选择相应的并发策略进行优化和开发。

ArkTS支持异步并发和多线程并发。

​ ● Promise和async/await提供异步并发能力,适用于单次I/O任务的开发场景。详细请参见异步并发概述。

​ ● TaskPool和Worker提供多线程并发能力,适用于CPU密集型任务、I/O密集型任务和同步任务等并发场景。详细请参见多线程并发概述。

二、 使用异步并发能力进行开发

1、异步并发概述

Promise和async/await提供异步并发能力,是标准的JS异步语法。异步代码会被挂起并在之后继续执行,同一时间只有一段代码执行,适用于单次I/O任务的场景开发,例如一次网络请求、一次文件读写等操作。

异步语法是一种编程语言的特性,允许程序在执行某些操作时不必等待其完成,而是可以继续执行其他操作。

1.1 Promise

Promise是一种用于处理异步操作的对象,可以将异步操作转换为类似于同步操作的风格,以方便代码编写和维护。Promise提供了一个状态机制来管理异步操作的不同阶段,并提供了一些方法来注册回调函数以处理异步操作的成功或失败的结果。

Promise有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已拒绝)。Promise对象创建后处于pending状态,并在异步操作完成后转换为fulfilled或rejected状态。

最基本的用法是通过构造函数实例化一个Promise对象,同时传入一个带有两个参数的函数,通常称为executor函数。executor函数接收两个参数:resolve和reject,分别表示异步操作成功和失败时的回调函数。例如,以下代码创建了一个Promise对象并模拟了一个异步操作:

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    const randomNumber = Math.random();
    if (randomNumber > 0.5) {
      resolve(randomNumber);
    } else {
      reject(new Error('Random number is too small'));
    }
  }, 1000);
});

上述代码中,setTimeout函数模拟了一个异步操作,并在1秒钟后随机生成一个数字。如果随机数大于0.5,则执行resolve回调函数并将随机数作为参数传递;否则执行reject回调函数并传递一个错误对象作为参数。

Promise对象创建后,可以使用then方法和catch方法指定fulfilled状态和rejected状态的回调函数。then方法可接受两个参数,一个处理fulfilled状态的函数,另一个处理rejected状态的函数。只传一个参数则表示状态改变就执行,不区分状态结果。使用catch方法注册一个回调函数,用于处理“失败”的结果,即捕获Promise的状态改变为rejected状态或操作失败抛出的异常。例如:

promise.then(result => {
  console.info(`Random number is ${result}`);
}).catch(error => {
  console.error(error.message);
});

上述代码中,then方法的回调函数接收Promise对象的成功结果作为参数,并将其输出到控制台上。如果Promise对象进入rejected状态,则catch方法的回调函数接收错误对象作为参数,并将其输出到控制台上。

1.2 async/await

async/await是一种用于处理异步操作的Promise语法糖,使得编写异步代码变得更加简单和易读。通过使用async关键字声明一个函数为异步函数,并使用await关键字等待Promise的解析(完成或拒绝),以同步的方式编写异步操作的代码。

async函数是一个返回Promise对象的函数,用于表示一个异步操作。在async函数内部,可以使用await关键字等待一个Promise对象的解析,并返回其解析值。如果一个async函数抛出异常,那么该函数返回的Promise对象将被拒绝,并且异常信息会被传递给Promise对象的onRejected()方法。

下面是一个使用async/await的例子,其中模拟了一个异步操作,该操作会在3秒钟后返回一个字符串。

async function myAsyncFunction() {
  const result = await new Promise((resolve) => {
    setTimeout(() => {
      resolve('Hello, world!');
    }, 3000);
  });
  console.info(String(result)); // 输出: Hello, world!
}

myAsyncFunction();

在上述示例代码中,使用了await关键字来等待Promise对象的解析,并将其解析值存储在result变量中。

需要注意的是,由于要等待异步操作完成,因此需要将整个操作包在async函数中。除了在async函数中使用await外,还可以使用try/catch块来捕获异步操作中的异常。

async function myAsyncFunction() {
  try {
    const result = await new Promise((resolve) => {
      resolve('Hello, world!');
    });
  } catch (e) {
    console.error(`Get exception: ${e}`);
  }
}

myAsyncFunction();

2、 单次I/O任务开发指导

Promise和async/await提供异步并发能力,适用于单次I/O任务的场景开发,本文以使用异步进行单次文件写入为例来提供指导。

​ 1. 实现单次I/O任务逻辑。

import fs from '@ohos.file.fs';

async function write(data: string, filePath: string) {
  let file = await fs.open(filePath, fs.OpenMode.READ_WRITE);
  fs.write(file.fd, data).then((writeLen) => {
    fs.close(file);
  }).catch((err) => {
    console.error(`Failed to write data. Code is ${err.code}, message is ${err.message}`);
  })
}

​ 2. 采用异步能力调用单次I/O任务。示例中的filePath的获取方式请参见获取应用文件路径。

let filePath = ...; // 应用文件路径
write('Hello World!', filePath).then(() => {
  console.info('Succeeded in writing data.');
})

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 并发
    +关注

    关注

    0

    文章

    7

    浏览量

    2260
  • HarmonyOS
    +关注

    关注

    79

    文章

    1859

    浏览量

    29267
收藏 人收藏

    评论

    相关推荐

    鸿蒙原生应用开发-ArkTS语言基础类库概述

    ArkTS语言基础类库是HarmonyOS系统上为应用开发者提供的常用基础能力,主要包含能力如下图所示。 1.提供异步
    发表于 03-05 15:42

    鸿蒙原生应用开发-ArkTS语言基础类库异步并发简述Promise

    Promise和async/await提供异步并发能力,是标准的JS异步语法。异步代码会被挂起并在之后继续执行,同一时间只有一段代码执行,适
    发表于 03-07 15:46

    HarmonyOS应用服务调试能力资料合集

    IDL实现的跨设备场景,开发者在如下表中的方法处设置断点,当中断到该断点处,执行 Step Into 即可进入到被调用方法的实现处。2、使用真机进行调试HarmonyOS使用真机设备进行
    发表于 03-25 11:31

    HarmonyOS/OpenHarmony应用开发API-ConnectOptions能力

    说明: 在连接指定的后台服务时作为入参用于接收连接过程中的状态变化。 编译环境: 编译器版本:release3.0 Api:8 语言:js 示例 *附件:HarmonyOSOpenHarmony应用开发API-ConnectOptions
    发表于 05-08 17:29

    HarmonyOS/OpenHarmony应用开发-ArkTSAPI系统能力SystemCapability

    ,随着目标设备是否支持该系统能力共同存在或消失,也会随着DevEco Studio一起提供给开发者做联想。 开发者可以在系统能力SystemCapability列表中查询
    发表于 08-10 16:39

    HarmonyOS NEXT新能力,一站式高效开发HarmonyOS应用

    者预览版及相关的开发套件的新能力进行了详细介绍。 华为终端BG软件部副总裁龚继华在开发者主题演讲开场时表示,HarmonyOS的快速迭代和
    发表于 08-14 15:08

    移动应用高级语言开发——并发探索

    ,探索共享对象的无锁并发。此外,在OpenHarmony并发调度上,也将针对现存的系统中线程泛滥问题,从时间和空间两个维度设计相关方案进行优化和改进,并将开发一套统一的并行框架,在运行
    发表于 08-28 17:08

    HarmonyOS如何使用异步并发能力进行开发

    策略进行优化和开发。 ArkTS支持异步并发和多线程并发。 ● Promise和async/await提供
    发表于 09-22 17:35

    HarmonyOS使用多线程并发能力开发

    代表,不需要开发者去面对锁带来的一系列复杂偶发的问题,同时并发度也相对较高,因此得到了广泛的支持和使用,也是当前ArkTS语言选择的并发模型。 由于Actor模型的内存隔离特性,所以需要进行
    发表于 09-25 15:23

    HarmonyOS语言基础类库开发指南上线啦!

    基础类库开发指南为HarmonyOS应用开发者提供了常用的基础能力: ○ 提供异步并发和多线程
    发表于 10-18 16:36

    HarmonyOS测试技术与实战-HarmonyOS图形栈整体架构和测试能力

    HDC 2021华为开发者大会HarmonyOS测试技术与实战-HarmonyOS图形栈整体架构和测试能力
    的头像 发表于 10-23 15:11 1234次阅读
    <b class='flag-5'>HarmonyOS</b>测试技术与实战-<b class='flag-5'>HarmonyOS</b>图形栈整体架构和测试<b class='flag-5'>能力</b>

    HarmonyOS NEXT新能力,一站式高效开发HarmonyOS应用

    开发者预览版及相关的开发套件的新能力进行了详细介绍。 持续听取开发者心声,HarmonyOS面向
    的头像 发表于 08-09 17:16 787次阅读

    HarmonyOS NEXT新能力,一站式高效开发HarmonyOS应用

    2023年8月6日华为开发者大会2023(HDC.Together)圆满收官,伴随着HarmonyOS 4的发布,华为向开发者发布了汇聚所有最新开发
    的头像 发表于 08-11 12:10 577次阅读

    HarmonyOS语言基础类库开发指南上线啦!

    语言基础类库提供哪些功能?多线程并发如何实现?TaskPool(任务池)和Worker在实现和使用场景上有何不同? 针对开发者关注的并发等语言基础类库的相关能力,我们在新推出的语言基础
    的头像 发表于 10-18 16:20 276次阅读
    <b class='flag-5'>HarmonyOS</b>语言基础类库<b class='flag-5'>开发</b>指南上线啦!

    鸿蒙OS开发实例:【ArkTS类库异步并发简述Promise】

    Promise和async/await提供异步并发能力,是标准的JS异步语法。异步代码会被挂起并在之后继续执行,同一时间只有一段代码执行,适
    的头像 发表于 04-02 18:37 228次阅读
    鸿蒙OS<b class='flag-5'>开发</b>实例:【ArkTS类库<b class='flag-5'>异步</b><b class='flag-5'>并发</b>简述Promise】