一、并发
并发是指在一个时间段内,多个事件、任务或操作同时进行或者交替进行的方式。在计算机科学中,特指多个任务或程序同时执行的能力。并发可以提升系统的吞吐量、响应速度和资源利用率,并能更好地处理多用户、多线程和分布式的场景。常见的并发模型有多线程、多进程、多任务、协程等。
1.并发概述
HarmonyOS系统提供的异步并发和多线程并发两种处理策略:
ArkTS系统提供的异步并发和多线程:
2.异步并发
2.1 异步并发概述
2.1.1 Promise
Promise是一种用于处理异步操作的对象。它表示一个可能还未完成的操作,并提供了一系列方法来处理操作的结果或错误。Promise对象有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已失败)。当操作完成时,Promise对象将会从pending状态转变为fulfilled或rejected状态,并调用相应的回调函数。使用Promise可以更加方便地管理异步操作,并避免回调函数嵌套过多的问题。
Promise是一种用于处理异步操作的对象。它可以认为是一个代理,用来代表一个尚未完成但最终会完成的操作。
Promise的定义:
const promise = new Promise((resolve, reject) => {
// 异步操作
// 如果操作成功,调用resolve(value)
// 如果操作失败,调用reject(error)
});
Promise构造函数接受一个函数作为参数,该函数被称为执行器(executor)。执行器会立即执行,并传入两个参数resolve和reject。在异步操作完成时,调用resolve传递最终的结果,或调用reject传递错误信息。
Promise的使用:
promise
.then((value) => {
// 当异步操作成功时,执行这里的回调函数
console.log('操作成功:', value);
})
.catch((error) => {
// 当异步操作失败时,执行这里的回调函数
console.error('操作失败:', error);
})
.finally(() => {
// 无论异步操作成功或失败都会执行这里的回调函数
console.log('操作完成');
});
通过then方法可以注册成功回调函数,通过catch方法可以注册失败回调函数,通过finally方法可以注册最终回调函数。当异步操作完成后,Promise会根据操作的结果调用相应的回调函数。
Promise还提供了一些其他的方法,例如all、race等,用于处理多个Promise对象的并行或竞争操作。
2.1.2 async/await
async/await是一种用于处理异步操作的语法糖(syntactic sugar),它基于Promise对象提供了一种更直观、更方便的方式来编写和处理异步代码。
async/await的定义和使用如下:
●async:async关键字用于修饰函数,表示该函数是一个异步函数。异步函数会自动返回一个Promise对象。
async function foo() {
// 异步操作
return result;
}
●await:await关键字只能在async函数内部使用,用于暂停异步函数的执行,等待一个Promise对象的状态变为resolved(成功)或rejected(失败),然后返回该Promise的结果。
async function myAsyncFunction() {
const result = await new Promise((resolve) => {
setTimeout(() => {
resolve('Hello, world!');
}, 3000);
});
console.info(String(result)); // 输出: Hello, world!
}
myAsyncFunction();
在async函数中使用await关键字可以实现类似同步代码的连续执行效果,而不需要嵌套使用回调函数或链式调用then方法。
async/await的优点包括:
●代码可读性更高,更接近同步代码的写法,易于理解和维护。
●可以在代码中使用try/catch语句来捕获和处理异步操作产生的错误。
●可以使用常规的控制流语法(如循环、条件语句)来组织和管理异步代码的执行顺序。
使用async/await时仍然依赖于Promise对象来处理异步操作。async/await只是一种更加简洁和易读的语法,本质上仍然是基于Promise的异步编程模式。
2.2 单次I/O任务开发指导
import fs from '@ohos.file.fs';
import common from '@ohos.app.ability.common';
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}`);
})
}
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();
@Entry
@Component
struct WebComponent {
build() {
Column() {
Text("Hello World")
}
}
}
3.多线程并发
3.1 多线程并发概述
3.1.1 简介
Actor并发模型是一种用于并发计算的编程模型。在该模型中,计算被抽象为一组独立的Actor,每个Actor都有自己的状态和行为,并且可以通过消息传递进行通信和协作。
在Actor模型中,每个Actor都可以接收异步消息,并且根据消息内容和当前状态来做出相应的响应。当一个Actor接收到消息时,它可以执行一系列的计