跳到主要内容

Worker常驻线程通过TaskPool进行多任务并发处理

ArkTS应用开发过程中,可以选择TaskPool或Worker线程进行多任务并发处理,也可以两种并发能力都选择。

本示例将说明在Worker线程中通过TaskPool执行并发任务。

  1. 在主线程中创建Worker线程并发送消息。

    // workerAndTaskpool.ets
    import { MessageEvents, worker } from '@kit.ArkTS';
    import { PromptAction } from '@kit.ArkUI';

    @Entry
    @Component
    struct Index {
    @State message: string = '在主线程中创建Worker线程并发送消息';
    @State returnMessage: string = 'return...';
    @State promptAction: PromptAction = this.getUIContext().getPromptAction();

    build() {
    RelativeContainer() {
    Button(this.message)
    .fontSize(25)
    .id('HelloWorld')
    .fontWeight(FontWeight.Bold)
    .alignRules({
    center: { anchor: '__container__', align: VerticalAlign.Center },
    middle: { anchor: '__container__', align: HorizontalAlign.Center }
    })
    .onClick(() => {
    // 1. 创建Worker实例
    const myWorker = new worker.ThreadWorker('entry/ets/workers/Worker.ets');

    // 2. 注册onmessage回调函数,以处理Worker发送到主线程的消息
    myWorker.onmessage = (e: MessageEvents) => {
    console.info('主线程收到最终结果:', e.data.result);
    this.returnMessage = '主线程收到最终结果:' + e.data.result;
    this.promptAction.showToast({ message: this.returnMessage });
    myWorker.terminate(); // 选择合适的时机销毁Worker
    };

    // 3. 向Worker发送启动指令
    myWorker.postMessage({ type: 'start', data: 10 });
    })
    // ...
    }
    .height('100%')
    .width('100%')
    }
    }
  2. 在Worker线程中调用TaskPool执行并发任务。

    // Worker.ets
    import { MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
    import { taskpool } from '@kit.ArkTS';

    const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
    workerPort.onmessage = async (e: MessageEvents) => {
    if (e.data.type === 'start') {
    // 模拟Worker数据处理
    const processedData = heavyComputation(e.data.data);

    // 调用TaskPool执行并发任务
    const task = new taskpool.Task(parallelTask, processedData);
    const result = await taskpool.execute(task);
    console.info('Worker线程返回结果: ', result);

    // 将最终结果返回主线程
    workerPort.postMessage({
    status: 'success',
    result: result
    });
    }
    }

    function heavyComputation(base: number): number {
    let sum = 0;
    for (let i = 0; i < base * 10; i++) {
    sum += Math.sqrt(i);
    }
    return sum;
    }

    @Concurrent
    function parallelTask(base: number): number {
    let total = 0;
    for (let i = 0; i < base; i++) {
    total += i % 2 === 0 ? i : -i;
    }
    console.info('TaskPool线程计算结果: ', total);
    return total;
    }