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(节点名 我…...
动手吧,vue数字动画
数字动画,有数字的地方都能用上,拿去吧! 效果: 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系统服务器的情景: 当服务器存储不足时,或者要接入更多的数据,就会挂载新磁盘,…...
ruoyi框架使用自定义用户表登录
背景 有的时候我们做框架升级或改造的时候,需要用到原来的部分表,比如只是用ruoyi的框架,然后登录的用户逻辑还是想用自己的表,那么接下来这边文章将介绍修改逻辑。 修改教程 1、SysLoginController.java 大家找到这个login方…...
计算机视觉与深度学习-卷积神经网络-卷积图像去噪边缘提取-卷积-[北邮鲁鹏]
目录标题 参考学习链接卷积的定义卷积的性质叠加性平移不变性交换律结合律分配律标量 边界填充边界填充方法 - 常数填充最常用常数填充零填充(zero padding)拉伸镜像 卷积示例单位脉冲核无变化平移平滑锐化 卷积核平均卷积核高斯卷积核高斯卷积核定义高斯…...
JS手动实现发布者-订阅者模式
发布-订阅模式是一种对象间一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都将得到状态改变的通知。具体过程是:订阅者把自己想订阅的事件注册到调度中心,当发布者更新该事件时通知调度中心,由调度中…...
【含面试题】MySQL死锁日志分析与解决的Java代码实现
AI绘画关于SD,MJ,GPT,SDXL百科全书 面试题分享点我直达 2023Python面试题 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI…...
解决方案:TSINGSEE青犀+智能分析网关助力智慧仓储智能化监管
为全面保障物流仓储的安全性与完整性,解决仓库管理难题,优化物流仓储方式,提升仓储效率,降低人工成本,旭帆科技推出智慧仓储AI视频智能分析方案,利用物联网、大数据、云计算等技术,对仓储管理进…...
进程间通信
#include <unistd.h> int pipe(int pipefd[2]); 功能:创建一个匿名管道,用于进程间通信 参数: -int pipefd[2]:传出参数 pipefd[0]对应的是管道的读端 pipefd[0]对应的是管道的写端 返回值: 成功返回0,失败返回-…...
Ubuntu 22.04.3 LTS安装
最近换电脑了,准备重新装一下ubuntu。多年前装过ubuntu很老的版本,现在发现官网最新的LTS版本是 Ubuntu 22.04.3 LTS 版本。那重新装的话,肯定装最新的版本了。这里我记录下自己的安装过程,作为以后的笔记查看。 我的环境&#x…...
记一次manjaro-i3系统sogoupinying候选词无法正常显示中文(变方框了)问题解决方案
记一次manjaro-i3系统sogoupinying候选词无法正常显示中文(变方框了)问题解决方案 前言解决方案 前言 今天早上发现公司电脑显卡驱动好像坏了,各种折腾完了干脆把系统搞黑屏无法开机了,时间有限懒再修了,于是重装了系…...
Lua学习笔记:词法分析
前言 本篇在讲什么 Lua的词法分析 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 ★提高阅读体验★ 👉 ♠ 一级标题…...
flask服务鉴权
基本认证(Basic Authentication): 这是一种简单的鉴权方式,需要客户端发送用户名和密码,服务器验证后允许或拒绝访问。可以使用 Flask-BasicAuth 扩展来实现。首先,安装扩展: pip install Fla…...
【2023华为杯B题】DFT类矩阵的整数分解逼近(思路及代码下载)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
基于微信小程序的校园生活管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言运行环境学生微信端的主要功能有:管理员的主要功能有:具体实现截图视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝1…...
SQL server 创建存储过程
SQL Server如何创建存储过程 存储过程: 可以理解为完成特定功能的一组 SQL 语句集,存储在数据库中,经过第一次编译,之后的运行不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数…...
一文了解亚马逊云科技适用于 Amazon Lightsail 的托管数据库
Amazon Lightsail 是亚马逊云科技提供的一种易上手使用、月度价格经济实惠,并包括了计算实例、容器、存储、数据库的虚拟专用服务器。在创建时可以进行业务蓝图选择,可选择包含多种操作系统(Linux/Windows 等)或操作系统加上典型应…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
关于 ffmpeg设置摄像头报错“Could not set video options” 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/148515355 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
