0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-04-24 17:45 次阅读

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

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

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

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

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

导入模块

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

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

taskpool.execute

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

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

系统能力: SystemCapability.Utils.Lang

参数

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

返回值:

类型说明
Promiseexecute是异步方法,返回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();

[](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Release/zh-cn/application-dev/reference/apis/js-apis-taskpool.md#taskpoolexecute-1)taskpool.execute

execute(task: Task, priority?: Priority): Promise

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

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
task[Task]需要在任务池中执行的任务。
priority[Priority]等待执行的任务的优先级(暂未支持)。

返回值:

类型说明
Promiseexecute是异步方法,返回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();

[](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Release/zh-cn/application-dev/reference/apis/js-apis-taskpool.md#taskpoolcancel)taskpool.cancel

cancel(task: Task): void

取消任务池中的任务。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
task[Task]需要取消执行的任务。

错误码:

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

错误码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();

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • API
    API
    +关注

    关注

    2

    文章

    1461

    浏览量

    61489
  • 鸿蒙
    +关注

    关注

    56

    文章

    2267

    浏览量

    42485
  • HarmonyOS
    +关注

    关注

    79

    文章

    1946

    浏览量

    29736
  • OpenHarmony
    +关注

    关注

    25

    文章

    3548

    浏览量

    15736
收藏 人收藏

    评论

    相关推荐

    ArkTS语言基础-解析

    ArkTS语言基础是HarmonyOS系统上为应用开发者提供的常用基础能力,主要包含能力如下图所示。 图1 ArkTS语言基础
    发表于 02-20 16:44

    鸿蒙原生应用开发-ArkTS语言基础多线程@Concurrent装饰器校验并发函数

    taskpool from \'@ohos.taskpool\'; @Concurrent function add(num1: number, num2: number): number
    发表于 03-18 10:30

    鸿蒙原生应用开发-ArkTS语言基础多线程CPU密集型任务TaskPool

    。 3.创建Task,通过execute()执行任务,在当前任务结束后,会将直方图处理结果同时返回。 结果数组汇总处理。 import taskpool from \'@ohos.taskpo
    发表于 03-19 14:14

    鸿蒙原生应用开发-ArkTS语言基础多线程I/O密集型任务开发

    和filePath2的获取方式请参见获取应用文件路径。 import taskpool from \'@ohos.taskpool\'; let filePath1 = ...; // 应用文件路径 let
    发表于 03-21 14:57

    鸿蒙原生应用开发-ArkTS语言基础多线程TaskPool和Worker的对比(一)

    TaskPool任务)和Worker的作用是为应用程序提供一个多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这
    发表于 03-25 14:11

    鸿蒙原生应用开发-ArkTS语言基础多线程TaskPool和Worker的对比(二)

    TaskPool运作机制 图1 TaskPool运作机制示意图 TaskPool支持开发者在主线程封装任务抛给任务队列,系统选择合适的工作线
    发表于 03-26 15:25

    基于OpenHarmony标准系统的C++公共基础案例:ThreadPoll

    1、程序简介 该程序是基于OpenHarmony标准系统的C++公共基础的线程处理:ThreadPoll。 本案例完成如下工作: 创建1个线程
    发表于 08-12 11:42

    HarmonyOS语言基础开发指南上线啦!

    语言基础提供哪些功能?多线程并发如何实现?TaskPool任务)和Worker在实现和使
    发表于 10-18 16:36

    OpenHarmony C++公共基础应用案例:Thread

    OpenHarmony C++公共基础应用案例:Thread 1、程序简介 该程序是基于OpenHarmony的C++公共基础
    发表于 11-22 11:50

    基于openharmony移植的ohos拼图支持

    项目介绍 项目名称:PuzzleView 所属系列:openharmony的第三方组件适配移植 功能:ohos拼图支持 项目移植状态:主功能完成,由于ohos暂不支持,所以分享功能暂
    发表于 03-22 11:24 2次下载

    基于openharmony适配移植的控件和常用组合成的Genius-Ohos

    项目介绍 项目名称:Genius-Ohos 所属系列:openharmony的第三方组件适配移植 功能:是 Material Design 控件和一些常用组合而成 项目移植状态:主
    发表于 04-07 09:06 1次下载

    HarmonyOS语言基础开发指南上线啦!

    语言基础提供哪些功能?多线程并发如何实现?TaskPool任务)和Worker在实现和使
    的头像 发表于 10-18 16:20 427次阅读
    HarmonyOS<b class='flag-5'>语言</b>基础<b class='flag-5'>类</b><b class='flag-5'>库</b>开发指南上线啦!

    鸿蒙APP开发:【ArkTS多线程】TaskPool和Worker的对比

    TaskPool任务)和Worker的作用是为应用程序提供一个多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这
    的头像 发表于 03-26 22:09 462次阅读
    鸿蒙APP开发:【ArkTS<b class='flag-5'>类</b><b class='flag-5'>库</b>多线程】<b class='flag-5'>TaskPool</b>和Worker的对比

    鸿蒙OpenHarmony大合集:【语言基础

    本示例集合语言基础的各个子模块,展示了各个模块的基础功能
    的头像 发表于 04-29 16:38 404次阅读
    鸿蒙<b class='flag-5'>OpenHarmony</b>大合集:【<b class='flag-5'>语言</b>基础<b class='flag-5'>类</b><b class='flag-5'>库</b>】

    OpenHarmony标准系统C++公共基础案例:HelloWorld

    1、程序简介该程序是基于凌蒙派OpenHarmony-v3.2.1标准系统C++公共基础的简单案例:HelloWorld。主要讲解C++公共基础
    的头像 发表于 08-13 08:23 244次阅读
    <b class='flag-5'>OpenHarmony</b>标准系统C++公共基础<b class='flag-5'>类</b><b class='flag-5'>库</b>案例:HelloWorld