OpenHarmony语言基础类库【@ohos.taskpool(启动任务池)】

news/2024/11/13 9:34:08/

 任务池(taskpool)作用是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。您可以使用任务池API创建后台任务(Task),并对所创建的任务进行如任务执行、任务取消的操作。理论上您可以使用任务池API创建数量不受限制的任务,但是出于内存因素不建议您这样做。此外,不建议您在任务中执行阻塞操作,特别是无限期阻塞操作,长时间的阻塞操作占据工作线程,可能会阻塞其他任务调度,影响您的应用性能。

您所创建的同一优先级任务的执行顺序可以由您决定,任务真实执行的顺序与您调用任务池API提供的任务执行接口顺序一致。任务默认优先级是MEDIUM。(任务优先级机制暂未支持)

当同一时间待执行的任务数量大于任务池工作线程数量,任务池会根据负载均衡机制进行扩容,增加工作线程数量,减少整体等待时长。同样,当执行的任务数量减少,工作线程数量大于执行任务数量,部分工作线程处于空闲状态,任务池会根据负载均衡机制进行缩容,减少工作线程数量。(负载均衡机制暂未支持)

任务池API以数字形式返回错误码。有关各个错误码的更多信息,请参阅文档 鸿蒙开发>鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。。

说明:
本模块首批接口从API version 9 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

导入模块

搜狗高速浏览器截图20240326151450.png

HarmonyOS与OpenHarmony鸿蒙文档籽料:mau123789是v直接拿import taskpool from '@ohos.taskpool';

taskpool.execute

execute(func: Function, ...args: unknown[]): Promise<unknown>

将待执行的函数放入taskpool内部任务队列等待,等待分发到工作线程执行。当前执行模式不可取消任务。

系统能力:  SystemCapability.Utils.Lang

参数:

参数名类型必填说明
funcFunction执行的逻辑需要传入函数,支持的函数返回值类型请查序列化支持类型。
argsunknown[]执行逻辑的函数所需要的参数,支持的参数类型请查序列化支持类型。默认值为undefined。

返回值:

类型说明
Promise<unknown>execute是异步方法,返回Promise对象。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

错误码ID错误信息
10200003Worker initialization failure.
10200006Serializing an uncaught exception failed.
10200014The function is not mark as concurrent.

示例:

@Concurrent
function printArgs(args) {console.log("printArgs: " + args);return args;
}async function taskpoolExecute() {let value = await taskpool.execute(printArgs, 100);console.log("taskpool result: " + value);
}taskpoolExecute();

)taskpool.execute

execute(task: Task, priority?: Priority): Promise<unknown>

将创建好的任务放入taskpool内部任务队列等待,等待分发到工作线程执行。当前执行模式可尝试调用cancel进行任务取消。

系统能力:  SystemCapability.Utils.Lang

参数:

参数名类型必填说明
taskTask需要在任务池中执行的任务。
priorityPriority等待执行的任务的优先级(暂未支持)。

返回值:

类型说明
Promise<unknown>execute是异步方法,返回Promise对象。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

错误码ID错误信息
10200003Worker initialization failure.
10200006Serializing an uncaught exception failed.
10200014The function is not mark as concurrent.

示例:

@Concurrent
function printArgs(args) {console.log("printArgs: " + args);return args;
}async function taskpoolExecute() {let task = new taskpool.Task(printArgs, 100);let value = await taskpool.execute(task);console.log("taskpool result: " + value);
}taskpoolExecute();

taskpool.cancel

cancel(task: Task): void

取消任务池中的任务。

系统能力:  SystemCapability.Utils.Lang

参数:

参数名类型必填说明
taskTask需要取消执行的任务。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

错误码ID错误信息
10200015If the task is not exist.
10200016If the task is running.

任务取消成功示例:

@Concurrent
function printArgs(args) {console.log("printArgs: " + args);return args;
}async function taskpoolCancel() {let task = new taskpool.Task(printArgs, 100);taskpool.execute(task);try {taskpool.cancel(task);} catch (e) {console.log("taskpool.cancel occur error:" + e);}
}taskpoolCancel();

已执行的任务取消失败示例:

@Concurrent
function printArgs(args) {console.log("printArgs: " + args);return args;
}async function taskpoolCancel() {let task = new taskpool.Task(printArgs, 100);let value = taskpool.execute(task);let start = new Date().getTime();while (new Date().getTime() - start < 1000) { // 延时1s,确保任务已执行continue;}try {taskpool.cancel(task); //任务已执行,取消失败} catch (e) {console.log("taskpool.cancel occur error:" + e);}
}taskpoolCancel();

正在执行的任务取消失败示例:

@Concurrent
function printArgs(args) {console.log("printArgs: " + args);return args;
}async function taskpoolCancel() {let task1 = new taskpool.Task(printArgs, 100);let task2 = new taskpool.Task(printArgs, 200);let task3 = new taskpool.Task(printArgs, 300);let task4 = new taskpool.Task(printArgs, 400);let task5 = new taskpool.Task(printArgs, 500);let task6 = new taskpool.Task(printArgs, 600);let res1 = taskpool.execute(task1);let res2 = taskpool.execute(task2);let res3 = taskpool.execute(task3);let res4 = taskpool.execute(task4);let res5 = taskpool.execute(task5);let res6 = taskpool.execute(task6);try {taskpool.cancel(task1); // task1任务正在执行,取消失败} catch (e) {console.log("taskpool.cancel occur error:" + e);}
}taskpoolCancel();

Priority

表示所创建任务(Task)的优先级。(暂未支持)

系统能力:  SystemCapability.Utils.Lang

名称说明
HIGH0任务为高优先级。
MEDIUM1任务为中优先级。
LOW2任务为低优先级。

Task

表示任务。使用以下方法前,需要先构造Task。

constructor

constructor(func: Function, ...args: unknown[])

Task的构造函数。

系统能力:  SystemCapability.Utils.Lang

参数:

参数名类型必填说明
funcFunction任务执行需要传入函数,支持的函数返回值类型请查序列化支持类型。
argsunknown[]任务执行传入函数的参数,支持的参数类型请查序列化支持类型。默认值为undefined。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

错误码ID错误信息
10200014The function is not mark as concurrent.

示例:

@Concurrent
function printArgs(args) {console.log("printArgs: " + args);return args;
}let task = new taskpool.Task(printArgs, "this is my first Task");

属性

系统能力:  SystemCapability.Utils.Lang

名称类型可读可写说明
functionFunction创建任务时需要传入的函数,支持的函数返回值类型请查序列化支持类型。
argumentsunknown[]创建任务传入函数所需的参数,支持的参数类型请查序列化支持类型。

其他说明

序列化支持类型

序列化支持类型包括:All Primitive Type(不包括symbol)、Date、String、RegExp、Array、Map、Set、Object、ArrayBuffer、TypedArray。

注意事项

  • 仅支持在Stage模型且module的compileMode为esmodule的project中使用taskpool api。确认module的compileMode方法:查看当前module的build-profile.json5,在buildOption中补充"compileMode": "esmodule"。
  • taskpool任务只支持引用入参传递或者import的变量,不支持使用闭包变量,使用装饰器@Concurrent进行拦截。
  • taskpool任务只支持普通函数或者async函数,不支持类成员函数或者匿名函数,使用装饰器@Concurrent进行拦截。
  • 装饰器@Concurrent仅支持在ets文件使用。

简单使用

示例一

// 支持普通函数、引用入参传递
@Concurrent
function printArgs(args) {console.log("printArgs: " + args);return args;
}async function taskpoolExecute() {// taskpool.execute(task)let task = new taskpool.Task(printArgs, "create task, then execute");let val1 = await taskpool.execute(task);console.log("taskpool.execute(task) result: " + val1);// taskpool.execute(function)let val2 = await taskpool.execute(func, "execute task by func");console.log("taskpool.execute(function) result: " + val2);
}taskpoolExecute();

示例二

// b.ets
export let c = 2000;
// 引用import变量
// a.ets(与b.ets位于同一目录中)
import { c } from "./b";@Concurrent
function printArgs(a) {console.log(a);console.log(c);return a;
}async function taskpoolExecute() {// taskpool.execute(task)let task = new taskpool.Task(printArgs, "create task, then execute");let val1 = await taskpool.execute(task);console.log("taskpool.execute(task) result: " + val1);// taskpool.execute(function)let val2 = await taskpool.execute(printArgs, "execute task by func");console.log("taskpool.execute(function) result: " + val2);
}taskpoolExecute();

示例三

// 支持async函数
@Concurrent
async function delayExcute() {let ret = await Promise.all([new Promise(resolve => setTimeout(resolve, 1000, "resolved"))]);return ret;
}async function taskpoolExecute() {taskpool.execute(delayExcute).then((result) => {console.log("TaskPoolTest task result: " + result);});
}taskpoolExecute();

示例四

// c.ets
@Concurrent
function strSort(inPutArr) {let newArr = inPutArr.sort();return newArr;
}
export async function func1() {console.log("taskpoolTest start");let strArray = ['c test string', 'b test string', 'a test string'];let task = new taskpool.Task(strSort, strArray);let result = await taskpool.execute(task);console.log("func1 result:" + result);
}export async function func2() {console.log("taskpoolTest2 start");let strArray = ['c test string', 'b test string', 'a test string'];taskpool.execute(strSort, strArray).then((result) => {console.log("func2 result: " + result);});
}// a.ets(与c.ets在同一目录中)
import { taskpoolTest1, taskpoolTest2 } from "./c";func1();
func2();

鸿蒙Next核心技术分享

1、鸿蒙基础知识←《鸿蒙NEXT星河版开发学习文档》

2、鸿蒙ArkUI←《鸿蒙NEXT星河版开发学习文档》

3、鸿蒙进阶技术←《鸿蒙NEXT星河版开发学习文档》

 4、鸿蒙就业高级技能←《鸿蒙NEXT星河版开发学习文档》 

 5、鸿蒙多媒体技术←《鸿蒙NEXT星河版开发学习文档》 

6、鸿蒙南向驱动开发←《鸿蒙NEXT星河版开发学习文档》  

7、鸿蒙南向内核设备开发←《鸿蒙NEXT星河版开发学习文档》  

 8、鸿蒙系统裁剪与移植←《鸿蒙NEXT星河版开发学习文档》  


http://www.ppmy.cn/news/1435498.html

相关文章

leetcode刷题笔记——使用双指针处理链表问题

面试的时候经常碰见诸如获取倒数第k个元素&#xff0c;获取中间位置的元素&#xff0c;判断链表是否存在环&#xff0c;判断环的长度等和长度与位置有关的问题。这些问题都可以通过灵活运用双指针来解决 如果存在环&#xff0c;如何判断环的长度呢&#xff1f;方法是&#xff…

java的单元测试和反射

单元测试 就是针对最小的功能单元&#xff0c;编写测试代码对其进行正确性测试 Junit单元测试框架&#xff1a; 可以用来对方法进行测试 有点&#xff1a; 可以灵活的编写测试代码&#xff0c;可以针对某个方法进行测试&#xff0c;也支持一键完成对全部方法的自动发测试&a…

不碎片化学习,尽量用整块的时间系统化学习

从高中毕业之后&#xff0c;我们好像就很难再继续那种系统化的学习&#xff0c;甚至失去了自我知识构建的能力。然而&#xff0c;真正的理解和掌握知识需要深入和连贯&#xff0c;这正是系统化学习的优势所在。 系统化学习的重要性 全面理解&#xff1a;系统化学习能够帮助我…

部署轻量级Gitea替代GitLab进行版本控制(一)

Gitea 是一款使用 Golang 编写的可自运营的代码管理工具。 Gitea Official Website gitea: Gitea的首要目标是创建一个极易安装&#xff0c;运行非常快速&#xff0c;安装和使用体验良好的自建 Git 服务。我们采用Go作为后端语言&#xff0c;这使我们只要生成一个可执行程序即…

SQLAlchemy的使用

SQLAlchemy中filter函数的使用 https://blog.csdn.net/m0_67093160/article/details/133318889 创建临时字段 select id , CONCAT(‘内容’) AS fullname from example_table; Pandas数据类型转换_pandas转换数据类型 https://blog.csdn.net/qq_41404557/article/details/125…

设计前后端系统以处理长时间运行的计算任务并提供缓存支持

后端设计 1. 任务队列 创建一个任务队列来存储提交的计算任务。 Component public class TaskQueue {private final Queue<CalculationTask> queue new LinkedList<>();public synchronized void addTask(CalculationTask task) {queue.add(task);}public sync…

【数据结构】树和森林(树和森林的存储结构、树森林二叉树的转换、树和森林的遍历

5.树和森林 5.1 树的存储结构 树的逻辑结构 树是n个结点的有限集合。n0时称为空树。 在任意一棵非空树中应满足&#xff1a; 1&#xff09;有且只有一个特定的根结点&#xff1b; 2&#xff09;当n>1&#xff0c;其余结点可分为m个互不相交的有限集合&#xff0c;每个集合本…

【CSS】CSS实现元素逐渐消失(实现元素透明逐渐消失/模糊)

mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%);mask-image 属性用于定义一个遮罩&#xff0c;它可以隐藏元素的一部分或全部内容。在这个示例中&#xff0c;我们使用 mask-image 属性来定义一个线性渐变的遮罩&#xff0c;使得列表项的内…