taskpool任务执行结束后如何执行回调方法?

taskpool任务执行结束后如何执行回调方法

阅读 466
avatarAI BotBETA

在 Python 中,TaskPool 通常用于并发执行多个任务。当你使用 TaskPool 执行任务时,你可以为每个任务添加一个回调函数,该函数将在任务完成后被调用。这可以通过 TaskPool 的 posttask 方法实现。

下面是一个示例代码,展示了如何使用 TaskPool 在任务完成后执行回调方法:

from concurrent.futures import ThreadPoolExecutor

def task(n):
    print(f"Task {n} started")
    # 模拟任务执行时间
    import time
    time.sleep(2)
    print(f"Task {n} finished")

def callback(n):
    print(f"Callback for task {n} called")

with ThreadPoolExecutor() as executor:
    # 提交任务并指定回调函数
    for i in range(5):
        executor.submit(task, i).add_done_callback(callback)

在上面的示例中,我们首先导入了 ThreadPoolExecutor 类。然后,我们定义了两个函数 taskcallback,分别表示任务和回调函数。task 函数只是简单地打印出任务的开始和结束消息,并模拟了任务执行时间。callback 函数将在任务完成后被调用,并打印出回调消息。

接下来,我们使用 ThreadPoolExecutor 创建了一个线程池。然后,我们循环提交了 5 个任务到线程池中,并使用 add_done_callback 方法为每个任务添加了一个回调函数 callback。这样,当每个任务完成后,回调函数将被自动调用。

运行上述代码,输出将会是:

Task 0 started
Task 1 started
Task 2 started
Task 3 started
Task 4 started
Task 0 finished
Callback for task 0 called
Task 1 finished
Callback for task 1 called
Task 2 finished
Callback for task 2 called
Task 3 finished
Callback for task 3 called
Task 4 finished
Callback for task 4 called

可以看到,每个任务完成后,对应的回调函数就会被调用。这样你就可以在任务执行结束后执行回调方法了。

1 个回答

可参考如下示例:

import taskpool from '@ohos.taskpool'; 
 
@Concurrent 
function imageProcessing(dataSlice: ArrayBuffer) { 
  // 步骤1: 具体的图像处理操作及其他耗时操作 
  return dataSlice; 
} 
 
function histogramStatistic(pixelBuffer: ArrayBuffer) { 
  // 步骤2: 分成三段并发调度 
  let number = pixelBuffer.byteLength / 3; 
  let buffer1 = pixelBuffer.slice(0, number); 
  let buffer2 = pixelBuffer.slice(number, number * 2); 
  let buffer3 = pixelBuffer.slice(number * 2); 
  let task1 = new taskpool.Task(imageProcessing, buffer1); 
  let task2 = new taskpool.Task(imageProcessing, buffer2); 
  let task3 = new taskpool.Task(imageProcessing, buffer3); 
  taskpool.execute(task1).then((ret: ArrayBuffer[]) => { 
    // 步骤3: 结果处理 
  }); 
  taskpool.execute(task2).then((ret: ArrayBuffer[]) => { 
    // 步骤3: 结果处理 
  }); 
  taskpool.execute(task3).then((ret: ArrayBuffer[]) => { 
    // 步骤3: 结果处理 
  }); 
} 
 
@Entry 
@Component 
struct Index { 
  @State message: string = 'Hello World' 
  build() { 
    Row() { 
      Column() { 
        Text(this.message) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            let data: ArrayBuffer; 
            histogramStatistic(data); 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进