鸿蒙开发-ArkTS语言-并发

鸿蒙开发-UI-交互事件-键鼠事件

鸿蒙开发-UI-交互事件-焦点事件

鸿蒙开发-UI-交互事件-手势事件

鸿蒙开发-UI-web

鸿蒙开发-UI-web-页面

鸿蒙开发-ArkTS语言-基础类库

文章目录

前言

一、并发概述

二、异步并发开发

1. 异步并发概述

1.1 Promise

1.2 async/await

2. 单次IO任务

三、多线程并发开发

1. 多线程概述

2. TaskPool和Worker

2.1 TaskPool实现特点

2.2 TaskPool使用场景

2.3 TaskPool运行机制

2.4 Worker实现特点

2.5 Worker使用场景以及注意事项

3. @Concurrent

总结


前言

上文简单介绍ArkTS语言基础类库相关概述,简单了解了ArkTS语言提供的基础能力,本文将学习ArkTS语言并发

一、并发概述

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

二、异步并发开发

1. 异步并发概述

Promise和async/await提供异步并发能力,是标准的JS异步语法。异步代码会被挂起并在之后继续执行,同一时间只有一段代码执行,适用于单次I/O任务的场景开发,例如一次网络请求、一次文件读写等操作。异步语法是一种编程语言的特性,允许程序在执行某些操作时不必等待其完成,而是可以继续执行其他操作

1.1 Promise

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

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

Promise使用

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

//step1:实例化一个Promise对象,同时传入一个带有两个参数(resolve和reject)的函数,resolve和reject分别表示异步操作成功和失败时的回调函数
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);
});

//step2: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);
});

1.2 async/await

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

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

代码示例

//模拟了一个异步操作,该操作会在3秒钟后返回一个字符串

async function myAsyncFunction() {
//step1:await关键字来等待Promise对象的解析,并将其解析值存储在result变量中
  const result = await new Promise((resolve) => {
    setTimeout(() => {
      resolve('Hello, world!');
    }, 3000);
  });
  console.info(String(result)); // 输出: Hello, world!
}

myAsyncFunction();

2. 单次IO任务

代码示例

import fs from '@ohos.file.fs';
import common from '@ohos.app.ability.common';

//step1:定义异步函数实现写文件
async function write(data: string, file: fs.File): Promise<void> {
  fs.write(file.fd, data).then((writeLen: number) => {
    console.info('write data length is: ' + writeLen)
  }).catch((err) => {
    console.error(`Failed to write data. Code is ${err.code}, message is ${err.message}`);
  })
}

//step2:采用异步能力调用step1定义的写文件函数
async function testFunc(): Promise<void> {
  let context = getContext() as common.UIAbilityContext;
  let filePath: string = context.filesDir + "/test.txt"; // 应用文件路径
  let file: fs.File = await fs.open(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  write('Hello World!', file).then(() => {
    console.info('Succeeded in writing data.');
  }).catch((err) => {
    console.error(`Failed to write data. Code is ${err.code}, message is ${err.message}`);
  })
  fs.close(file);
}
testFunc();

三、多线程并发开发

1. 多线程概述

并发模型是用来实现不同应用场景中并发任务的编程模型,常见的并发模型分为基于内存共享的并发模型和基于消息通信的并发模型。Actor并发模型作为基于消息通信并发模型的典型代表,不需要开发者去面对锁带来的一系列复杂偶发的问题,同时并发度也相对较高,因此得到了广泛的支持和使用,也是当前ArkTS语言选择的并发模型。由于Actor模型的内存隔离特性,所以需要进行跨线程的数据序列化传输。

2. TaskPool和Worker

TaskPool(任务池)和Worker的作用是为应用程序提供一个多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这些任务阻塞主线程,从而最大化系统的利用率,降低整体资源消耗,并提高系统的整体性能。

2.1 TaskPool实现特点

2.2 TaskPool使用场景

TaskPool偏向独立任务维度,该任务在线程中执行,无需关注线程的生命周期

  

2.3 TaskPool运行机制

TaskPool支持开发者在主线程封装任务抛给任务队列,系统选择合适的工作线程,进行任务的分发及执行,再将结果返回给主线程。接口直观易用,支持任务的执行、取消。工作线程数量上限为4

2.4 Worker实现特点

2.5 Worker使用场景以及注意事项

Worker偏向线程的维度,支持长时间占据线程执行,需要主动管理线程生命周期。

     

 2.6 Worker运行机制

创建Worker的线程称为宿主线程(不一定是主线程,工作线程也支持创建Worker子线程),Worker自身的线程称为Worker子线程(或Actor线程、工作线程)。每个Worker子线程与宿主线程拥有独立的实例,包含基础设施、对象、代码段等。Worker子线程和宿主线程之间的通信是基于消息传递的,Worker通过序列化机制与宿主线程之间相互通信,完成命令及数据交互。

3. @Concurrent

在使用TaskPool时,执行的并发函数需要使用该装饰器修饰,否则无法通过相关校验

  


总结

本文详细学习ArkTS语言并发异步并发开发和多线程并发开发两种并发场景,了解了两种并发场景的区别,以及开发方法。同时详细学习了多线程并发开发的两种方式,以及各个使用场景。下文将学习多线程并发开发的示例分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/512635.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【HTML】制作一个简单的三角形动态图形

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML和CSS代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文件名改为[index.html]&#xff0c;CSS的文件名…

llama.cpp运行qwen0.5B

编译llama.cp 参考 下载模型 05b模型下载 转化模型 创建虚拟环境 conda create --prefixD:\miniconda3\envs\llamacpp python3.10 conda activate D:\miniconda3\envs\llamacpp安装所需要的包 cd G:\Cpp\llama.cpp-master pip install -r requirements.txt python conver…

JavaScript 对象管家 Proxy

JavaScript 在 ES6 中&#xff0c;引入了一个新的对象类型 Proxy&#xff0c;它可以用来代理另一个对象&#xff0c;并可以在代理过程中拦截、覆盖和定制对象的操作。Proxy 对象封装另一个对象并充当中间人&#xff0c;其提供了一个捕捉器函数&#xff0c;可以在代理对象上拦截…

什么是ECC?ECC 和 RSA 之间有何区别?

椭圆曲线密码学 (ECC) 是一种基于椭圆曲线数学的公开密钥加密算法。 它提供了一种执行密钥交换、数字签名和加密等加密操作的安全方式。 ECC 为 1977 年首次发布的 Rivest-Shamir-Adleman (RSA) 加密算法提供了一种替代性方案。 继续阅读&#xff0c;进一步了解椭圆曲线密码学…

一文读懂!企业怎样才能选择适合自己的生产管理系统?

怎么选择适合所在企业的生产管理系统呢&#xff1f;该从哪些方面对生产管理系统进行评估&#xff1f;又怎样实现高效的生产管理呢&#xff1f; 本文我将和大家一起解决这些有关生产管理系统的问题&#xff1f; 生产管理系统模板&#xff0c;可直接查看和使用&#xff1a;https…

设备巡检系统革新:凡尔码平台的智能化配电箱管理

配电箱作为电气安全的关键环节&#xff0c;其巡检工作至关重要。传统的巡检方法依赖手工记录&#xff0c;不仅效率低下&#xff0c;而且难以确保数据的实时性和准确性。凡尔码平台的二维码设备巡检系统&#xff0c;以数字化解决方案&#xff0c;颠覆了这一过程&#xff0c;实现…

HWOD:自守数

一、知识点 break只会结束最里面的一层循环 int型数按位比较的时候&#xff0c;可以直接求余比较&#xff0c;无需转换为char型数组后再按下标比较 二、题目 1、描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如&#xff1a;25^2 625&#xff0c;76^2 5776…

element-ui empty 组件源码分享

今日简单分享 empty 组件的源码实现&#xff0c;主要从以下三个方面&#xff1a; 1、empty 组件页面结构 2、empty 组件属性 3、empty 组件 slot 一、empty 组件页面结构 二、empty 组件属性 2.1 image 属性&#xff0c;图片地址&#xff0c;类型 string&#xff0c;无默认…

数据结构——栈(C语言版)

前言&#xff1a; 在学习完数据结构顺序表和链表之后&#xff0c;其实我们就可以做很多事情了&#xff0c;后面的栈和队列&#xff0c;其实就是对前面的顺序表和链表的灵活运用&#xff0c;今天我们就来学习一下栈的原理和应用。 准备工作&#xff1a;本人习惯将文件放在test.c…

线下陪玩小程序APP源码开发--线下游戏陪玩小程序App开发(源码平台)-APP小程序H5-前后端源码交付。

线下陪玩达人入驻服务系统软件开发&#xff08;APP、公众号、小程序、H5搭建&#xff09; 线下陪玩接单系统平台开发案例分析 1.丰富的娱乐项目&#xff1a;该平台提供了丰富的娱乐项目&#xff0c;包括但不限于桌游、运动、户外活动等&#xff0c;能够满足不同用户的需求。 2…

“不知今夕是何年”的周基年解法 | 得物技术

2024年1月5日&#xff0c;周五&#xff0c;本来是个美好的日子&#xff0c;期待着马上到来的周末。可是下午1点多&#xff0c;接到产品一个问题反馈&#xff0c;经过一番排查&#xff0c;23年7月份上线的功能&#xff0c;对于跨年场景的处理有问题&#xff0c;其核心在于“周的…

windows 11 如何使用 IE 浏览器

众所周知&#xff1a;IE 浏览器已经被微软废弃&#xff0c;像windows 11这种系统内置已经找不到 IE 浏览器了&#xff0c;这对前端工程师而言&#xff0c;肯定是不行的。因为项目中&#xff0c;经常有现场需要支持 ie 浏览器。&#xff08;吐槽一下&#xff1a;微软都放弃了&am…

Centos7安装单机版Kafka

下载 链接&#xff1a;https://pan.baidu.com/s/1W8lVEF6Y-xlg6zr3l9QAbg?pwdhbkt 提取码&#xff1a;hbkt 上传到服务器/opt目录 安装 # kafka安装目录为 /opt/kafka cd /opt; mkdir kafka; mv kafka_2.13-2.7.0.tgz ./kafka;cd kafka; #解压 tar -zxvf kafka_2.13-2.7.0…

OpenHarmony实战开发-如何通过Stage模型实现一个简单的游戏卡片

介绍 本示例展示了如何通过Stage模型实现一个简单的游戏卡片。 通过卡片支持的点击事件进行交互&#xff0c;让用户通过点击的先后顺序把一个乱序的成语排列成正确的成语。使用了C和TS的混合编程方式&#xff0c;将获取随机数的能力下沉到C实现&#xff0c;并通过NAPI的能力将…

[RK3588-Android12] 调试MIPI-双通道-压缩屏(Video Mode/MIPI Dphy 8Lane/DSC 144HZ)

问题描述 被测屏幕&#xff1a;小米Pad6 分辨率&#xff1a;1800X2880 模式&#xff1a;Video Mode/MIPI Dphy 8Lane/DSC 144HZ PPS: 11 00 00 89 30 80 0B 40 03 84 00 14 01 C2 01 C2 02 00 01 F4 00 20 01 AB 00 06 00 0D 05 7A 06 1A 18 00 10 F0 03 0C 20 00 06 0B 0B 33…

ssh连接虚拟机 ubuntu

目录 虚拟机设置linux 安装sshFileZilla登录 虚拟机设置 linux 安装ssh sudo apt-get install openssh-server FileZilla登录

【问题处理】银河麒麟操作系统实例分享,理光打印机lpr协议打印问题处理

1.问题环境 系统版本&#xff1a;Kylin-Desktop-V10-SP1-General-Release-xxx-20221120-x86_64 内核版本&#xff1a;linux 5.4.18-44kt-generic 系统版本&#xff1a;麒麟v10 sp1 处理器&#xff1a;kx6640ma 2.问题描述 问题详细描述&#xff1a;用户通过lpr协议去连接…

2024052期传足14场胜负前瞻

2024052期售止时间为4月3日&#xff08;周三&#xff09;22点00分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率7场&#xff0c;1.5-2.0赔率1场&#xff0c;其他场次是平半盘、平盘。本期14场难度中等偏下。以下为基础盘前瞻&#xff0c;大家可根据自身…

算法学习17:背包问题(动态规划)

算法学习17&#xff1a;背包问题&#xff08;动态规划&#xff09; 文章目录 算法学习17&#xff1a;背包问题&#xff08;动态规划&#xff09;前言一、01背包问题&#xff1a;1.朴素版&#xff1a;&#xff08;二维&#xff09;2.优化版&#xff1a;&#xff08;一维&#xf…

蓝色wordpress外贸建站模板

蓝色wordpress外贸建站模板 https://www.mymoban.com/wordpress/7.html