harmony 鸿蒙Worker常驻线程通过TaskPool进行多任务并发处理
Worker常驻线程通过TaskPool进行多任务并发处理
ArkTS应用开发过程中,可以选择TaskPool或Worker线程进行多任务并发处理,也可以两种并发能力都选择。
本示例将说明在Worker线程中通过TaskPool执行并发任务。
- 在主线程中创建Worker线程并发送消息。
// Index.ets
import { worker } from '@kit.ArkTS';
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
build() {
RelativeContainer() {
Text(this.message)
.id('HelloWorld')
.fontSize($r('app.float.page_text_font_size'))
.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. 接收Worker返回的结果
myWorker.onmessage = (e) => {
console.log('主线程收到最终结果:', e.data.result);
myWorker.terminate(); // 销毁Worker
};
// 3. 向Worker发送启动指令
myWorker.postMessage({ type: 'start', data: 10 });
})
}
.height('100%')
.width('100%')
}
}
- 在Worker线程中调用TaskPool执行并发任务。
// Worker.ets
import { ErrorEvent, 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.log('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.log('TaskPool线程计算结果: ', total);
return total;
}
你可能感兴趣的鸿蒙文章
0
赞
- 所属分类: 后端技术
- 本文标签:
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦