鸿蒙多线程并发选型指南:TaskPool与Worker深度解析

40 阅读1分钟

一、核心机制对比(API20)

对比维度TaskPoolWorker
线程管理自动线程池调度(支持动态扩缩容)需手动创建/销毁线程(上限64个)
参数传递直接传递可序列化数据(支持ArrayBuffer转移)需封装消息对象(单参数传递)
生命周期任务执行后自动回收(超3分钟任务强制回收)需手动调用terminate()释放资源
高级特性支持优先级、取消、依赖关系、任务组仅支持线程优先级(API18+)
// TaskPool典型用法(带优先级)
import { taskpool } from '@kit.ArkTS';

@Concurrent
function imageProcess(data: ArrayBuffer): void { /*...*/ }

taskpool.execute(imageProcess, buffer, taskpool.Priority.HIGH);

// Worker典型用法
const worker = new worker.ThreadWorker('entry/workers/MyWorker.ts');
worker.postMessage({ type: 'process', data: buffer });

二、适用场景分析

1. TaskPool推荐场景

  • 轻量级并行计算
    如图片分块处理、数据分片统计等无状态任务

    // 图像分块处理示例
    const taskGroup = new taskpool.TaskGroup();
    for (let i=0; i<8; i++) {
      const slice = buffer.slice(i*chunkSize, (i+1)*chunkSize);
      taskGroup.addTask(new taskpool.Task(imageProcess, slice));
    }
    taskpool.execute(taskGroup);
    
  • 需要任务控制
    涉及优先级调度(如后台下载管理)、任务取消(如滑动取消预加载)

2. Worker推荐场景

  • 长时状态任务
    如持续运行的音视频编解码、数据库事务处理

    // Worker线程持续处理音频流
    workerPort.onmessage = (e) => {
      const audioData = e.data;
      processAudio(audioData); // 需要保持处理状态
      workerPort.postMessage(result);
    };
    
  • 句柄型资源操作
    需长期持有句柄的场景(如网络长连接、文件流操作)

三、选型决策指南

  1. 任务时长判断
    ≤3分钟且无状态 → TaskPool
    >3分钟或需保持状态 → Worker

  2. 线程管理复杂度
    希望零管理成本 → TaskPool
    需要精细控制 → Worker

  3. 特殊功能需求
    需优先级/取消/依赖 → TaskPool
    需长期资源持有 → Worker