当前位置: 首页 > news >正文

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

一、并发概述

并发是指在同一时间段内,能够处理多个任务的能力。为了提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰,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.');})

相关文章:

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

一、并发概述 并发是指在同一时间段内,能够处理多个任务的能力。为了提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰,HarmonyOS 系统提供了异步并发和多线程并发两种处理策略。 ● 异步并发是指异步代码在执行到一定程度后会被暂…...

时间格式化时候HH和hh的区别

SimpleDateFormat simpleDateFormatnew SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); simpleDateFormat.format(new Date()) HH(大写):表示使用24小时制(也称为军用时间制)来表示小时。它的范围是从00到23。例…...

aliyunoss上传图片

依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.8.1</version></dependency>配置文件 config:alioss:endpoint: oss-cn-shanghai.aliyuncs.com&#xff08;节点名 我…...

动手吧,vue数字动画

数字动画&#xff0c;有数字的地方都能用上&#xff0c;拿去吧&#xff01; 效果&#xff1a; 1、template部分 <template><div class"v-count-up">{{ dispVlaue }}</div> </template> 2、js部分 export default {data() {return {timer…...

Android12之仿Codec2.0实现传递编解码器组件本质(四十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…...

MongoDB【部署 04】Windows系统实现MongoDB多磁盘存储

Windows系统实现多磁盘存储 1.为什么2.多磁盘存储2.1 数据库配置2.2 文件夹磁盘映射2.3 创建新的数据集 3.总结 1.为什么 这里仅针对只有一台Windows系统服务器的情景&#xff1a; 当服务器存储不足时&#xff0c;或者要接入更多的数据&#xff0c;就会挂载新磁盘&#xff0c…...

ruoyi框架使用自定义用户表登录

背景 有的时候我们做框架升级或改造的时候&#xff0c;需要用到原来的部分表&#xff0c;比如只是用ruoyi的框架&#xff0c;然后登录的用户逻辑还是想用自己的表&#xff0c;那么接下来这边文章将介绍修改逻辑。 修改教程 1、SysLoginController.java 大家找到这个login方…...

计算机视觉与深度学习-卷积神经网络-卷积图像去噪边缘提取-卷积-[北邮鲁鹏]

目录标题 参考学习链接卷积的定义卷积的性质叠加性平移不变性交换律结合律分配律标量 边界填充边界填充方法 - 常数填充最常用常数填充零填充&#xff08;zero padding&#xff09;拉伸镜像 卷积示例单位脉冲核无变化平移平滑锐化 卷积核平均卷积核高斯卷积核高斯卷积核定义高斯…...

JS手动实现发布者-订阅者模式

发布-订阅模式是一种对象间一对多的依赖关系&#xff0c;当一个对象的状态发送改变时&#xff0c;所有依赖于它的对象都将得到状态改变的通知。具体过程是&#xff1a;订阅者把自己想订阅的事件注册到调度中心&#xff0c;当发布者更新该事件时通知调度中心&#xff0c;由调度中…...

【含面试题】MySQL死锁日志分析与解决的Java代码实现

AI绘画关于SD,MJ,GPT,SDXL百科全书 面试题分享点我直达 2023Python面试题 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI…...

解决方案:TSINGSEE青犀+智能分析网关助力智慧仓储智能化监管

为全面保障物流仓储的安全性与完整性&#xff0c;解决仓库管理难题&#xff0c;优化物流仓储方式&#xff0c;提升仓储效率&#xff0c;降低人工成本&#xff0c;旭帆科技推出智慧仓储AI视频智能分析方案&#xff0c;利用物联网、大数据、云计算等技术&#xff0c;对仓储管理进…...

进程间通信

#include <unistd.h> int pipe(int pipefd[2]); 功能&#xff1a;创建一个匿名管道&#xff0c;用于进程间通信 参数&#xff1a; -int pipefd[2]:传出参数 pipefd[0]对应的是管道的读端 pipefd[0]对应的是管道的写端 返回值&#xff1a; 成功返回0&#xff0c;失败返回-…...

Ubuntu 22.04.3 LTS安装

最近换电脑了&#xff0c;准备重新装一下ubuntu。多年前装过ubuntu很老的版本&#xff0c;现在发现官网最新的LTS版本是 Ubuntu 22.04.3 LTS 版本。那重新装的话&#xff0c;肯定装最新的版本了。这里我记录下自己的安装过程&#xff0c;作为以后的笔记查看。 我的环境&#x…...

记一次manjaro-i3系统sogoupinying候选词无法正常显示中文(变方框了)问题解决方案

记一次manjaro-i3系统sogoupinying候选词无法正常显示中文&#xff08;变方框了&#xff09;问题解决方案 前言解决方案 前言 今天早上发现公司电脑显卡驱动好像坏了&#xff0c;各种折腾完了干脆把系统搞黑屏无法开机了&#xff0c;时间有限懒再修了&#xff0c;于是重装了系…...

Lua学习笔记:词法分析

前言 本篇在讲什么 Lua的词法分析 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449; ♠ 一级标题…...

flask服务鉴权

基本认证&#xff08;Basic Authentication&#xff09;&#xff1a; 这是一种简单的鉴权方式&#xff0c;需要客户端发送用户名和密码&#xff0c;服务器验证后允许或拒绝访问。可以使用 Flask-BasicAuth 扩展来实现。首先&#xff0c;安装扩展&#xff1a; pip install Fla…...

【2023华为杯B题】DFT类矩阵的整数分解逼近(思路及代码下载)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

基于微信小程序的校园生活管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境学生微信端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝1…...

SQL server 创建存储过程

SQL Server如何创建存储过程 存储过程&#xff1a; 可以理解为完成特定功能的一组 SQL 语句集&#xff0c;存储在数据库中&#xff0c;经过第一次编译&#xff0c;之后的运行不需要再次编译&#xff0c;用户通过指定存储过程的名字并给出参数&#xff08;如果该存储过程带有参数…...

一文了解亚马逊云科技适用于 Amazon Lightsail 的托管数据库

Amazon Lightsail 是亚马逊云科技提供的一种易上手使用、月度价格经济实惠&#xff0c;并包括了计算实例、容器、存储、数据库的虚拟专用服务器。在创建时可以进行业务蓝图选择&#xff0c;可选择包含多种操作系统&#xff08;Linux/Windows 等&#xff09;或操作系统加上典型应…...

【antd Col】奇怪的TypeError: Cannot read properties of undefined (reading ‘then‘)

现象 修改antd的Col组件的layouts属性为span后&#xff0c;并通过监听resize事件对span列宽进行动态变化时&#xff0c;报错TypeError: Cannot read properties of undefined (reading ‘then‘)。 补充示例一 由于我使用了飞冰ice.js&#xff0c;且在以下过程中写了如下语句…...

requests处理 multipart/form-data 请求以及 boundary值问题

requests处理 multipart/form-data 请求以及 boundary值问题 前言1. 请求需要携带本地资源2. 请求需要携带json3. 总结 前言 关于 Content-type: multipart/form-data可以看一下这篇文章, 分析特别详细 HTTP协议之multipart/form-data请求分析 put和post区别不大, 只是上传资…...

FBX文件结构解读【文本格式】

FBX 格式几乎受到所有 3D 引擎的支持&#xff0c;是 Autodesk 开发的 3D 模型的专有格式。它支持顶点、索引、法线、UV坐标、材质和动画。 FBX还支持许多其他类型的信息&#xff0c;但它们对游戏引擎几乎没有用处。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 有两种…...

JS基础语法

JS是一门面向对象的编程语言&#xff0c;运行在客户端的脚本语言&#xff0c;可以基于Node.js进行服务器端编程 JS的作用: 表单动态校验网页特效服务端开发 浏览器执行JS&#xff1a; 浏览器分为两部分&#xff1a;渲染引擎和JS引擎 渲染引擎用来解析HTML和CSS&#xff0c;…...

【Zabbix监控一】zabbix的原理与安装

利用一个优秀的监控软件&#xff0c;我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器状态 ●可以在 Web 前端方便的查看监控数据 ●可以回溯寻找事故发生时系统的问题和报警情况 总结&#xff1a;zabbix主要功能 监控&#xff0c;cpu负载&#xff0c;内存使用&a…...

图的十字链表存储结构

1.其实就是邻接表和逆邻接表的结合&#xff0c;说明白点&#xff0c;就是用箭头表示出弧头&#xff0c;弧尾&#xff0c;以及他们之间的关系 2.顶点结构 3.弧结构 3.这样根据上面的结点十字链表结构就很好分析了...

精华回顾:Web3 前沿创新者在 DESTINATION MOON 共话未来

9 月 17 日&#xff0c;由 TinTinLand 主办的「DESTINATION MOON: Web3 Dev Summit Shanghai 2023」线下活动在上海黄浦如约而至。 本次 DESTINATION MOON 活动作为 2023 上海区块链国际周的 Side Event&#xff0c;设立了 4 场主题演讲与 3 个圆桌讨论&#xff0c;聚集了诸多…...

【RPC】gRPC 安装及使用

本文记录下 Mac 安装 gRPC 的过程。 参考&#xff1a;官网 1. gRPC 安装 gRPC 安装步骤如下&#xff1a; 克隆 grpc 代码 git clone --recurse-submodules -b v1.58.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc注意&#xff1a;不要直接 git clone http…...

Pygame中Sprite类的使用3

在Pygame中Sprite类的使用2_棉猴的博客-CSDN博客中提到了通过派生自pygame.sprite.Sprite类的自定义类Zombie&#xff0c;可以实现一个僵尸的移动。可以通过pygame.sprite.Group类实现对多个Zombie类实例的管理&#xff0c;即可以实现多个僵尸的移动。 1 pygame.sprite.Group类…...

23年下考前须知-软考中级信息安全工程师

信息安全工程师主要涉及计算机信息安全方面&#xff0c;在计算机软硬件、网络、应用相关领域从事安全系统设计、安全产品开发、产品集成、信息系统安全检测与审计等方面工作&#xff0c;服务单位可以是国家机关、企事业单位及科研教学单位等。 一、考试报名时间 信安考试一年…...

做教务网站的需求分析/广告投放的方式有哪些

在简书看到的这篇关于如何学习新东西的总结&#xff0c;挺有收获的。虽然有些道理大家可能都懂&#xff0c;但是如果不付诸实践那还是没有意义的。以下是正文&#xff1a; 有人曾从我工作的一家公司盗取了9千万美元。我不太懂得如何观人识人。这家公司最终关门了。 有一些事情我…...

餐饮网站建设怎样/seo基础优化包括哪些内容

1&#xff0c;环境说明如下&#xff1a; Django1.8.2版本Python3.5版本MySql 5.7版本 2&#xff0c;错误出现如下&#xff1a; 3&#xff0c;解决办法 python3.XX以后使用小写的configparser&#xff0c;改为首字母大写即可 4&#xff0c;查看当前环境已安装的软件 5&#x…...

网站设计知名企业/免费的编程自学网站

解决方法&#xff1a;https://jingyan.baidu.com/article/e3c78d648fd42e3c4c85f584.html 在用OpenGL进行图形的绘制的时候&#xff0c;出现了错误&#xff0c;找不到“glaux.lib”&#xff0c;现在给出解决方案 工具/原料 vs2013 opengl函数库 方法/步骤 1 我们要先下载gl…...

做游戏还是做网站好/哪里有网页设计公司

一、认识CyclicBarrier 对于CyclicBarrier大多数人感到陌生&#xff0c;其实CyclicBarrier是一种多线程并发控制使用工具&#xff0c;和CountDownLatch非常类似&#xff0c;实现线程之间的计数等待&#xff0c;也就是说一个线程或者多个线程等待其他线程完成任务&#xff0c;不…...

如何在服务器上做网站/自动外链工具

日期内核版本架构作者GitHubCSDN2016-05-12Linux-4.5X86 & armgatiemeLinuxDeviceDriversLinux进程管理与调度-之-进程的创建 前言 Linux下有3个特殊的进程&#xff0c;idle进程(PID 0), init进程(PID 1)和kthreadd(PID 2) * idle进程由系统自动创建, 运行在内核态 …...

嘉兴做网站的/seo工资待遇 seo工资多少

传送门 描述 求 a 的 b 次方对 p 取模的值&#xff0c;其中 1≤a,b,p≤10^9 输入格式 三个用空格隔开的整数a,b和p。 输出格式 一个整数&#xff0c;表示a^b mod p的值。 样例输入 2 3 9 样例输出 8 分析 b2^k2^(k-1)2^(k-2)...2^0;(仅当二进制下b的第k位为1) b&1 取出最低…...