0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學(xué)習在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區
會(huì )員中心
創(chuàng )作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內不再提示

OpenHarmony語(yǔ)言基礎類(lèi)庫【@ohos.taskpool(啟動(dòng)任務(wù)池)】

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-24 17:45 ? 次閱讀

任務(wù)池(taskpool)作用是為應用程序提供一個(gè)多線(xiàn)程的運行環(huán)境,降低整體資源的消耗、提高系統的整體性能,且您無(wú)需關(guān)心線(xiàn)程實(shí)例的生命周期。您可以使用任務(wù)池API創(chuàng )建后臺任務(wù)(Task),并對所創(chuàng )建的任務(wù)進(jìn)行如任務(wù)執行、任務(wù)取消的操作。理論上您可以使用任務(wù)池API創(chuàng )建數量不受限制的任務(wù),但是出于內存因素不建議您這樣做。此外,不建議您在任務(wù)中執行阻塞操作,特別是無(wú)限期阻塞操作,長(cháng)時(shí)間的阻塞操作占據工作線(xiàn)程,可能會(huì )阻塞其他任務(wù)調度,影響您的應用性能。

您所創(chuàng )建的同一優(yōu)先級任務(wù)的執行順序可以由您決定,任務(wù)真實(shí)執行的順序與您調用任務(wù)池API提供的任務(wù)執行接口順序一致。任務(wù)默認優(yōu)先級是MEDIUM。(任務(wù)優(yōu)先級機制暫未支持)

當同一時(shí)間待執行的任務(wù)數量大于任務(wù)池工作線(xiàn)程數量,任務(wù)池會(huì )根據負載均衡機制進(jìn)行擴容,增加工作線(xiàn)程數量,減少整體等待時(shí)長(cháng)。同樣,當執行的任務(wù)數量減少,工作線(xiàn)程數量大于執行任務(wù)數量,部分工作線(xiàn)程處于空閑狀態(tài),任務(wù)池會(huì )根據負載均衡機制進(jìn)行縮容,減少工作線(xiàn)程數量。(負載均衡機制暫未支持)

任務(wù)池API以數字形式返回錯誤碼。有關(guān)各個(gè)錯誤碼的更多信息,請參閱文檔 鴻蒙開(kāi)發(fā)指導文檔 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

說(shuō)明:
本模塊首批接口從API version 9 開(kāi)始支持。后續版本的新增接口,采用上角標單獨標記接口的起始版本。

導入模塊

搜狗高速瀏覽器截圖20240326151450.png

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

taskpool.execute

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

將待執行的函數放入taskpool內部任務(wù)隊列等待,等待分發(fā)到工作線(xiàn)程執行。當前執行模式不可取消任務(wù)。

系統能力: SystemCapability.Utils.Lang

參數

參數名類(lèi)型必填說(shuō)明
funcFunction執行的邏輯需要傳入函數,支持的函數返回值類(lèi)型請查[序列化支持類(lèi)型]。
argsunknown[]執行邏輯的函數所需要的參數,支持的參數類(lèi)型請查[序列化支持類(lèi)型]。默認值為undefined。

返回值:

類(lèi)型說(shuō)明
Promiseexecute是異步方法,返回Promise對象。

錯誤碼:

以下錯誤碼的詳細介紹請參見(jiàn)[語(yǔ)言基礎類(lèi)庫錯誤碼]。

錯誤碼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

將創(chuàng )建好的任務(wù)放入taskpool內部任務(wù)隊列等待,等待分發(fā)到工作線(xiàn)程執行。當前執行模式可嘗試調用cancel進(jìn)行任務(wù)取消。

系統能力: SystemCapability.Utils.Lang

參數:

參數名類(lèi)型必填說(shuō)明
task[Task]需要在任務(wù)池中執行的任務(wù)。
priority[Priority]等待執行的任務(wù)的優(yōu)先級(暫未支持)。

返回值:

類(lèi)型說(shuō)明
Promiseexecute是異步方法,返回Promise對象。

錯誤碼:

以下錯誤碼的詳細介紹請參見(jiàn)[語(yǔ)言基礎類(lèi)庫錯誤碼]。

錯誤碼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

取消任務(wù)池中的任務(wù)。

系統能力: SystemCapability.Utils.Lang

參數:

參數名類(lèi)型必填說(shuō)明
task[Task]需要取消執行的任務(wù)。

錯誤碼:

以下錯誤碼的詳細介紹請參見(jiàn)[語(yǔ)言基礎類(lèi)庫錯誤碼]。

錯誤碼ID錯誤信息
10200015If the task is not exist.
10200016If the task is running.

任務(wù)取消成功示例:

@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();

已執行的任務(wù)取消失敗示例:

@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) { // 延時(shí)1s,確保任務(wù)已執行
    continue;
  }

  try {
    taskpool.cancel(task); //任務(wù)已執行,取消失敗
  } catch (e) {
    console.log("taskpool.cancel occur error:" + e);
  }
}

taskpoolCancel();

正在執行的任務(wù)取消失敗示例:

@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任務(wù)正在執行,取消失敗
  } catch (e) {
    console.log("taskpool.cancel occur error:" + e);
  }
}

taskpoolCancel();

Priority

表示所創(chuàng )建任務(wù)(Task)的優(yōu)先級。(暫未支持)

系統能力: SystemCapability.Utils.Lang

名稱(chēng)說(shuō)明
HIGH0任務(wù)為高優(yōu)先級。
MEDIUM1任務(wù)為中優(yōu)先級。
LOW2任務(wù)為低優(yōu)先級。

Task

表示任務(wù)。使用以下方法前,需要先構造Task。

constructor

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

Task的構造函數。

系統能力: SystemCapability.Utils.Lang

參數:

參數名類(lèi)型必填說(shuō)明
funcFunction任務(wù)執行需要傳入函數,支持的函數返回值類(lèi)型請查[序列化支持類(lèi)型]。
argsunknown[]任務(wù)執行傳入函數的參數,支持的參數類(lèi)型請查[序列化支持類(lèi)型]。默認值為undefined。

錯誤碼:

以下錯誤碼的詳細介紹請參見(jiàn)[語(yǔ)言基礎類(lèi)庫錯誤碼]。

錯誤碼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

名稱(chēng)類(lèi)型可讀可寫(xiě)說(shuō)明
functionFunction創(chuàng )建任務(wù)時(shí)需要傳入的函數,支持的函數返回值類(lèi)型請查[序列化支持類(lèi)型]。
argumentsunknown[]創(chuàng )建任務(wù)傳入函數所需的參數,支持的參數類(lèi)型請查[序列化支持類(lèi)型]。

其他說(shuō)明

序列化支持類(lèi)型

序列化支持類(lèi)型包括: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任務(wù)只支持引用入參傳遞或者import的變量,不支持使用閉包變量,使用裝飾器@Concurrent進(jìn)行攔截。
  • taskpool任務(wù)只支持普通函數或者async函數,不支持類(lèi)成員函數或者匿名函數,使用裝飾器@Concurrent進(jìn)行攔截。
  • 裝飾器@Concurrent僅支持在ets文件使用。

簡(jiǎn)單使用

示例一

// 支持普通函數、引用入參傳遞
@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();

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權轉載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習之用,如有內容侵權或者其他違規問(wèn)題,請聯(lián)系本站處理。 舉報投訴
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1420

    瀏覽量

    61170
  • 鴻蒙
    +關(guān)注

    關(guān)注

    55

    文章

    1971

    瀏覽量

    42224
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1914

    瀏覽量

    29498
  • OpenHarmony
    +關(guān)注

    關(guān)注

    24

    文章

    3448

    瀏覽量

    15333
收藏 人收藏

    評論

    相關(guān)推薦

    ArkTS語(yǔ)言基礎類(lèi)-解析

    ArkTS語(yǔ)言基礎類(lèi)是HarmonyOS系統上為應用開(kāi)發(fā)者提供的常用基礎能力,主要包含能力如下圖所示。 圖1 ArkTS語(yǔ)言基礎類(lèi)
    發(fā)表于 02-20 16:44

    鴻蒙原生應用開(kāi)發(fā)-ArkTS語(yǔ)言基礎類(lèi)概述

    ArkTS語(yǔ)言基礎類(lèi)是HarmonyOS系統上為應用開(kāi)發(fā)者提供的常用基礎能力,主要包含能力如下圖所示。 1.提供異步并發(fā)和多線(xiàn)程并發(fā)的能力。 支持Promise和async/await等標準
    發(fā)表于 03-05 15:42

    鴻蒙原生應用開(kāi)發(fā)-ArkTS語(yǔ)言基礎類(lèi)多線(xiàn)程@Concurrent裝飾器校驗并發(fā)函數

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

    鴻蒙原生應用開(kāi)發(fā)-ArkTS語(yǔ)言基礎類(lèi)多線(xiàn)程CPU密集型任務(wù)TaskPool

    。 3.創(chuàng )建Task,通過(guò)execute()執行任務(wù),在當前任務(wù)結束后,會(huì )將直方圖處理結果同時(shí)返回。 結果數組匯總處理。 import taskpool from \'@ohos.taskpo
    發(fā)表于 03-19 14:14

    鴻蒙原生應用開(kāi)發(fā)-ArkTS語(yǔ)言基礎類(lèi)多線(xiàn)程I/O密集型任務(wù)開(kāi)發(fā)

    和filePath2的獲取方式請參見(jiàn)獲取應用文件路徑。 import taskpool from \'@ohos.taskpool\'; let filePath1 = ...; // 應用文件路徑 let
    發(fā)表于 03-21 14:57

    鴻蒙原生應用開(kāi)發(fā)-ArkTS語(yǔ)言基礎類(lèi)多線(xiàn)程TaskPool和Worker的對比(一)

    TaskPool任務(wù))和Worker的作用是為應用程序提供一個(gè)多線(xiàn)程的運行環(huán)境,用于處理耗時(shí)的計算任務(wù)或其他密集型任務(wù)??梢杂行У乇苊膺@
    發(fā)表于 03-25 14:11

    鴻蒙原生應用開(kāi)發(fā)-ArkTS語(yǔ)言基礎類(lèi)多線(xiàn)程TaskPool和Worker的對比(二)

    TaskPool運作機制 圖1 TaskPool運作機制示意圖 TaskPool支持開(kāi)發(fā)者在主線(xiàn)程封裝任務(wù)拋給任務(wù)隊列,系統選擇合適的工作線(xiàn)
    發(fā)表于 03-26 15:25

    鴻蒙原生應用開(kāi)發(fā)-ArkTS語(yǔ)言基礎類(lèi)多線(xiàn)程TaskPool和Worker的對比(三)

    一、TaskPool注意事項 實(shí)現任務(wù)的函數需要使用裝飾器@Concurrent標注,且僅支持在.ets文件中使用。 實(shí)現任務(wù)的函數入參需滿(mǎn)足序列化支持的類(lèi)型。 由于不同線(xiàn)程中上下文對象
    發(fā)表于 03-27 16:26

    趕緊收藏!7大類(lèi)400多種組件,鴻蒙三方來(lái)了!

    方法https://gitee.com/openharmony-tpc/butterknifeassertj-ohos快速調用其他封裝https://gitee.com/openharmon
    發(fā)表于 05-07 14:07

    HarmonyOS/OpenHarmony應用開(kāi)發(fā)-Stage模型ArkTS語(yǔ)言擴展能力基類(lèi)

    \'@ohos.app.ability.ExtensionAbility\'; 接口示例: *附件:HarmonyOSOpenHarmony應用開(kāi)發(fā)-stage模型ArkTS語(yǔ)言擴展能力基類(lèi)
    發(fā)表于 04-26 10:00

    移動(dòng)應用高級語(yǔ)言開(kāi)發(fā)——并發(fā)探索

    伸縮性。 TaskPool統一任務(wù)設計架構 在高級語(yǔ)言并發(fā)的發(fā)展中,業(yè)界更傾向于給開(kāi)發(fā)者提供更易用、更好用以及更高效的并發(fā)API。OpenHar
    發(fā)表于 08-28 17:08

    HarmonyOS CPU與I/O密集型任務(wù)開(kāi)發(fā)指導

    \'@ohos.taskpool\'; @Concurrent function imageProcessing(dataSlice: ArrayBuffer) { // 步驟1: 具體的圖像處理操作
    發(fā)表于 09-26 16:29

    HarmonyOS語(yǔ)言基礎類(lèi)開(kāi)發(fā)指南上線(xiàn)啦!

    語(yǔ)言基礎類(lèi)提供哪些功能?多線(xiàn)程并發(fā)如何實(shí)現?TaskPool任務(wù))和Worker在實(shí)現和使
    發(fā)表于 10-18 16:36

    OpenHarmony C++公共基礎類(lèi)應用案例:HelloWorld

    1、程序簡(jiǎn)介 該程序是基于OpenHarmony的C++公共基礎類(lèi)的簡(jiǎn)單案例:HelloWorld。 該應用案例已在OpenHarmony凌蒙派-RK3568開(kāi)發(fā)板(即
    發(fā)表于 11-22 11:21

    OpenHarmony C++公共基礎類(lèi)應用案例:Thread

    OpenHarmony C++公共基礎類(lèi)應用案例:Thread 1、程序簡(jiǎn)介 該程序是基于OpenHarmony的C++公共基礎類(lèi)
    發(fā)表于 11-22 11:50
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看