taskpool异步任务支持串行处理的方法

向taskpool扔任务后,任务的被执行时保证不了某一批任务是串行的。而业务是有这种需求的,如:对某一张共享内存的图片分三步处理:先裁剪成小图(task1)、再变圆角(task2)、再高斯模糊(task3),如果这三个task并行执行,可能会出现 模糊->圆角->裁剪的时序处理,使结果未达到预期。

HarmonyOS
2024-05-23 21:39:55
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zdl2000

提供两种方式解决:

1)配置优先级

请参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-taskpool-0000001860295901

备注:该种方法,只能在一定程度上解决问题,比如,回调函数是非常简单的常量计算,对于存在延时处理的业务,并不适合。

2)通过前面的task返回值来确认下一步执行

备注:该种方式是串行处理。

使用的核心API

import taskpool from '@ohos.taskpool'
taskpool.Task
taskpool.execute

核心代码解释

根据优先级机制处理:

@Concurrent   
function inspectStatus(arg: number): number {   
  hilog.info(0x0000, 'testTag', 'start inspectStatus: %{public}d', arg);   
  // 2s sleep   
  let t: number = Date.now();   
  while (Date.now() - t < 2000) {   
    continue;   
  }   
  hilog.info(0x0000, 'testTag', 'end inspectStatus: %{public}d', arg);   
  return arg + 1;   
}   
   
let allCount = 3;   
for (let i: number = 0; i < allCount; i++) {   
  let task1: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number   
  let task2: taskpool.Task = new taskpool.Task(inspectStatus, 200); // 200: test number   
  let task3: taskpool.Task = new taskpool.Task(inspectStatus, 300); // 300: test number   
  taskpool.execute(task1, taskpool.Priority.LOW);   
  taskpool.execute(task2, taskpool.Priority.MEDIUM);   
  taskpool.execute(task3, taskpool.Priority.HIGH);   
}

根据结果返回机制处理:

@Concurrent   
function testSerialHandle(arg: number): number {   
  hilog.info(0x0000, 'testTag', 'testSerialHandle: %{public}d', arg);   
  return arg + 1;   
}   
   
let task4: taskpool.Task = new taskpool.Task(testSerialHandle, 400); // 400: test number   
let task5: taskpool.Task = new taskpool.Task(testSerialHandle, 500); // 500: test number   
let task6: taskpool.Task = new taskpool.Task(testSerialHandle, 600); // 600: test number   
taskpool.execute(task4).then((value: number) => {   
  if (value == 401) {   
    taskpool.execute(task5).then((value2: number) => {   
      if (value2 == 501) {   
        taskpool.execute(task6);   
      }   
    });   
  }   
});

实现效果

适配的版本信息

IDE:DevEco Studio 4.1.1.300

SDK:HarmoneyOS 4.1.0.18

分享
微博
QQ
微信
回复
2024-05-24 16:45:43
相关问题
如何利用taskpool执行多任务
617浏览 • 1回复 待解决
TaskPool和Worker中任务调度机制
589浏览 • 1回复 待解决
taskPool参数支持Function类型吗
497浏览 • 1回复 待解决
ArkTs中异步方法如何转变成同步方法
548浏览 • 0回复 待解决
如何对异步方法进行插桩/替换
258浏览 • 1回复 待解决
Greenplum有哪些通用处理方法
2054浏览 • 1回复 待解决
static 方法支持mock吗?
230浏览 • 1回复 待解决
http请求支持patch方法
463浏览 • 1回复 待解决
TaskPool与Worker区别
583浏览 • 1回复 待解决
使用Promise实现一种串行调用方式
355浏览 • 1回复 待解决