Worker常驻线程通过TaskPool进行多任务并发处理
ArkTS应用开发过程中,可以选择TaskPool或Worker线程进行多任务并发处理,也可以两种并发能力都选择。
本示例将说明在Worker线程中通过TaskPool执行并发任务。
-
在主线程中创建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%') } } -
在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; }