0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙语言基础类库:ohos.worker 启动一个Worker

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-07-11 17:03 次阅读

启动一个Worker

说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 开发前请熟悉鸿蒙开发指导文档 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

Worker是与主线程并行的独立线程。创建Worker的线程称之为宿主线程,Worker自身的线程称之为Worker线程。创建Worker传入的url文件在Worker线程中执行,可以处理耗时操作但不可以直接操作UI。

导入模块

import worker from '@ohos.worker';

属性

系统能力: 以下各项对应的系统能力均为SystemCapability.Utils.Lang。

名称参数类型可读可写说明
parentPort[DedicatedWorkerGlobalScope]worker线程用于与宿主线程通信的对象。

WorkerOptions

Worker构造函数的选项信息,用于为Worker添加其他信息。

系统能力: 以下各项对应的系统能力均为SystemCapability.Utils.Lang。

名称参数类型可读可写说明
type"classic"按照指定方式执行脚本。
namestringWorker的名称。

Worker

使用以下方法前,均需先构造Worker实例,Worker类继承[EventTarget]。

constructor

constructor(scriptURL: string, options?: WorkerOptions)

Worker构造函数。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
scriptURLstringWorker执行脚本的url,路径规范:若DevEco新建工程在pages同级下没有workers目录,需要新建workers目录,将脚本文件放入workers目录。
options[WorkerOptions]Worker构造的选项。

返回值:

类型说明
Worker执行Worker构造函数生成的Worker对象,失败则返回undefined。

示例:

const workerInstance = new worker.Worker("workers/worker.js", {name:"first worker"});

postMessage

postMessage(message: Object, options?: PostMessageOptions): void

向Worker线程发送消息,数据的传输采用结构化克隆算法

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
messageObject发送至Worker的数据。
options[PostMessageOptions]可转移对象是 ArrayBuffer 的实例对象。transferList数组中不可传入null。

示例:

const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.postMessage("hello world");
const workerInstance= new worker.Worker("workers/worker.js");
var buffer = new ArrayBuffer(8);
workerInstance.postMessage(buffer, [buffer]);

on

on(type: string, listener: EventListener): void

向Worker添加一个事件监听。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
typestring监听事件的type。
listener[EventListener]回调的事件。

示例:

const workerInstance = new worker.Worker("workers/worker.js")
workerInstance.on("alert", (e)= >{
    console.log("alert listener callback");
})

once

once(type: string, listener: EventListener): void

向Worker添加一个事件监听,事件监听只执行一次便自动删除。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
typestring监听事件的type。
listener[EventListener]回调的事件。

示例:

const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.once("alert", (e)= >{
    console.log("alert listener callback");
})

off

off(type: string, listener?: EventListener): void

删除Worker的事件监听。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
typestring需要删除事件的type。
listener[EventListener]需要删除的回调的事件。

示例:

const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.off("alert");

terminate

terminate(): void

关闭Worker线程,终止Worker接收消息。

系统能力: SystemCapability.Utils.Lang

示例:

const workerInstance = new worker.Worker("workers/worker.js")
workerInstance.terminate()

onexit

onexit?: (code: number) => void

Worker对象的onexit属性表示Worker退出时被调用的事件处理程序,处理程序在宿主线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
codenumberWorker退出的code。

示例:

const workerInstance = new worker.Worker("workers/worker.js")
workerInstance.onexit = function(e) {
    console.log("onexit")
}

onerror

onerror?: (err: ErrorEvent) => void

Worker对象的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在宿主线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
err[ErrorEvent]异常数据。

示例:

const workerInstance = new worker.Worker("workers/worker.js")
workerInstance.onerror = function(e) {
    console.log("onerror")
}

onmessage

onmessage?: (event: MessageEvent) => void

Worker对象的onmessage属性表示宿主线程接收到来自其创建的Worker通过parentPort.postMessage接口发送的消息时被调用的事件处理程序,处理程序在宿主线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
event[MessageEvent]收到的Worker消息数据。

示例:

const workerInstance = new worker.Worker("workers/worker.js")
workerInstance.onmessage = function(e) {
    console.log("onerror")
}

onmessageerror

onmessageerror?: (event: MessageEvent) => void

Worker对象的onmessageerror属性表示当Worker对象接收到一条无法被序列化的消息时被调用的事件处理程序,处理程序在宿主线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
event[MessageEvent]异常数据。

示例:

const workerInstance = new worker.Worker("workers/worker.js")
workerInstance.onmessageerror= function(e) {
    console.log("onmessageerror")
}

EventTarget

addEventListener

addEventListener(type: string, listener: EventListener): void

向Worker添加一个事件监听。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
typestring监听事件的type。
listener[EventListener]回调的事件。

示例:

const workerInstance = new worker.Worker("workers/worker.js")
workerInstance.addEventListener("alert", (e)= >{
    console.log("alert listener callback");
})

removeEventListener

removeEventListener(type: string, callback?: EventListener): void

删除Worker的事件监听。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
typestring需要删除事件的type。
callback[EventListener]需要删除的回调的事件。

示例:

const workerInstance = new worker.Worker("workers/worker.js")
workerInstance.removeEventListener("alert")

dispatchEvent

dispatchEvent(event: Event): boolean

分发定义在Worker的事件。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
event[Event]需要分发的事件。

返回值:

类型说明
boolean分发的结果,false表示分发失败。

示例:

const workerInstance = new worker.Worker("workers/worker.js")
workerInstance.dispatchEvent({type:"alert"})

removeAllListener

removeAllListener(): void

删除Worker的所有事件监听。

系统能力: SystemCapability.Utils.Lang

示例:

const workerInstance = new worker.Worker("workers/worker.js")
workerInstance.removeAllListener({type:"alert"})

DedicatedWorkerGlobalScope

Worker线程用于与宿主线程通信的类,通过postMessage接口发送消息给宿主线程、close接口关闭Worker线程,DedicatedWorkerGlobalScope类继承[WorkerGlobalScope]。

postMessage

postMessage(message: Object, options?: PostMessageOptions): void

Worker向宿主线程发送消息。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
messageObject发送至Worker的数据。
options[PostMessageOptions]可转移对象是ArrayBuffer的实例对象。transferList数组中不可传入null。

示例:

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.Worker("workers/worker.js")
workerInstance.postMessage("hello world")
workerInstance.onmessage = function(e) {
    console.log("receive data from worker.js")
}
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
parentPort.onmessage = function(e){
    parentPort.postMessage("receive data from main.js")
}

close

close(): void

关闭Worker线程,终止Worker接收消息。

系统能力: SystemCapability.Utils.Lang

示例:

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.Worker("workers/worker.js")
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
parentPort.onmessage = function(e) {
    parentPort.close()
}

onmessage

onmessage?: (event: MessageEvent) => void

DedicatedWorkerGlobalScope的onmessage属性表示Worker线程收到来自其宿主线程通过worker.postMessage接口发送的消息时被调用的事件处理程序,处理程序在Worker线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
event[MessageEvent]收到的Worker消息数据。

示例:

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.Worker("workers/worker.js")
workerInstance.postMessage("hello world")
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
parentPort.onmessage = function(e) {
    console.log("receive main.js message")
}

onmessageerror

onmessageerror?: (event: MessageEvent) => void

DedicatedWorkerGlobalScope的onmessageerror属性表示当Worker对象接收到一条无法被反序列化的消息时被调用的事件处理程序,处理程序在Worker线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
event[MessageEvent]异常数据。

示例:

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.Worker("workers/worker.js")
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
parentPort.onmessageerror= function(e) {
    console.log("worker.js onmessageerror")
}

PostMessageOptions

明确数据传递过程中需要转移所有权对象的类,传递所有权的对象必须是ArrayBuffer。

系统能力: 以下各项对应的系统能力均为SystemCapability.Utils.Lang。

名称参数类型可读可写说明
transferObject[]ArrayBuffer数组,用于传递所有权。

Event

事件类。

系统能力: 以下各项对应的系统能力均为SystemCapability.Utils.Lang。

名称参数类型可读可写说明
typestring指定事件的type。
timeStampnumber事件创建时的时间戳(精度为毫秒)。

EventListener

事件监听类。

(evt: Event): void | Promise

执行的回调函数。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
evt[Event]回调的事件类。

返回值:

类型说明
voidPromise

示例:

const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.addEventListener("alert", (e)= >{
    console.log("alert listener callback");
})

ErrorEvent

错误事件类,用于表示Worker执行过程中出现异常的详细信息,ErrorEvent类继承[Event]。

系统能力: 以下各项对应的系统能力均为SystemCapability.Utils.Lang。

名称参数类型可读可写说明
messagestring异常发生的错误信息。
filenamestring出现异常所在的文件。
linenonumber异常所在的行数。
colnonumber异常所在的列数。
errorObject异常类型。

MessageEvent

消息类,持有Worker线程间传递的数据。

系统能力: 以下各项对应的系统能力均为SystemCapability.Utils.Lang。

名称参数类型可读可写说明
dataT线程间传递的数据。

WorkerGlobalScope

Worker线程自身的运行环境,WorkerGlobalScope类继承[EventTarget]。

属性

系统能力: 以下各项对应的系统能力均为SystemCapability.Utils.Lang。

QQ截图20240705210937.png

名称参数类型HarmonyOSOpenHarmony鸿蒙文档籽料:mau123789是v直接拿可读可写说明
namestringWorker的名字,有new Worker时指定。
self[WorkerGlobalScope] & typeof globalThisWorkerGlobalScope本身。

onerror

onerror?: (ev: ErrorEvent) => void

WorkerGlobalScope的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在Worker线程中执行。

系统能力: SystemCapability.Utils.Lang

参数:

参数名类型必填说明
ev[ErrorEvent]异常数据。

示例:

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.Worker("workers/worker.js")
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort
parentPort.onerror = function(e){
    console.log("worker.js onerror")
}

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Worker
    +关注

    关注

    0

    文章

    8

    浏览量

    6432
  • 鸿蒙
    +关注

    关注

    56

    文章

    2266

    浏览量

    42468
收藏 人收藏

    评论

    相关推荐

    鸿蒙OS开发案例:【ArkTS多线程CPU密集型任务Worker

    通过某地区提供的房价数据训练简易的房价预测模型,该模型支持通过输入房屋面积和房间数量去预测该区域的房价,模型需要长时间运行,房价预测需要使用前面的模型运行结果,因此需要使用Worker
    的头像 发表于 04-01 21:55 841次阅读
    <b class='flag-5'>鸿蒙</b>OS开发案例:【ArkTS<b class='flag-5'>类</b><b class='flag-5'>库</b>多线程CPU密集型任务<b class='flag-5'>Worker</b>】

    ArkTS语言基础-解析

    被设计用来传输和存储数据,是种可扩展标记语言语言基础提供了[XML生成、解析与转换]的能力。 URL、URI构造和解析能力:其中[U
    发表于 02-20 16:44

    鸿蒙原生应用开发-ArkTS语言基础概述

    扩展标记语言语言基础提供了XML生成、解析与转换的能力。 URL、URI构造和解析能力:其中URI是统资源标识符,可以唯
    发表于 03-05 15:42

    鸿蒙原生应用开发-ArkTS语言基础多线程TaskPool和Worker的对比(

    TaskPool(任务池)和Worker的作用是为应用程序提供多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这些任务阻塞主线程,从而最大化系统的利用率,降低整体资源消耗
    发表于 03-25 14:11

    鸿蒙原生应用开发-ArkTS语言基础多线程TaskPool和Worker的对比(二)

    易用,支持任务的执行、取消。工作线程数量上限为4。 Worker运作机制 图2 Worker运作机制示意图 创建Worker的线程称为宿主线程(不定是主线程,工作线程也支持创建
    发表于 03-26 15:25

    鸿蒙原生应用开发-ArkTS语言基础多线程TaskPool和Worker的对比(三)

    import worker from \'@ohos.worker\'; // 写法 // Stage模型-目录同级(entry模块下,workers目录与pages目录同级) const
    发表于 03-27 16:26

    HarmonyOS CPU与I/O密集型任务开发指导

    。 基于多线程并发机制处理CPU密集型任务可以提高CPU利用率,提升应用程序响应速度。 当进行系列同步任务时,推荐使用Worker;而进行大量或调度点较为分散的独立任务时,不方便使用8Wo
    发表于 09-26 16:29

    HarmonyOS语言基础开发指南上线啦!

    语言基础提供哪些功能?多线程并发如何实现?TaskPool(任务池)和Worker在实现和使用场景上有何不同? 针对开发者关注的并发等语言
    发表于 10-18 16:36

    面向对象嵌入式实时操作系统Worker1.0

    Worker1.0继承图1 Worker1.0主要的简介3 Worker1.0 API4 Worker1.0移植9
    发表于 04-29 18:01 39次下载
    面向对象嵌入式实时操作系统<b class='flag-5'>Worker</b>1.0

    normal worker_pool详细的创建过程代码分析

    默认 work 是在 normal worker_pool 中处理的。系统的规划是每个 CPU 创建两 normal worker_pool:
    的头像 发表于 04-08 14:35 7176次阅读
    normal <b class='flag-5'>worker</b>_pool详细的创建过程代码分析

    Tokio中hang死所有worker的方法

    原因是 tokio 里的待执行 task 不是简单的放到 queue 里,除了 runtime 内共享的,可被每个 worker 消费的run_queue[2],每个 worker
    的头像 发表于 02-03 16:26 891次阅读

    HarmonyOS语言基础开发指南上线啦!

    语言基础提供哪些功能?多线程并发如何实现?TaskPool(任务池)和Worker在实现和使用场景上有何不同? 针对开发者关注的并发等语言
    的头像 发表于 10-18 16:20 418次阅读
    HarmonyOS<b class='flag-5'>语言</b>基础<b class='flag-5'>类</b><b class='flag-5'>库</b>开发指南上线啦!

    鸿蒙APP开发:【ArkTS多线程】TaskPool和Worker的对比

    TaskPool(任务池)和Worker的作用是为应用程序提供多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这些任务阻塞主线程,从而最大化系统的利用率,降低整体资源消耗,并提高系统的整体性能。
    的头像 发表于 03-26 22:09 456次阅读
    <b class='flag-5'>鸿蒙</b>APP开发:【ArkTS<b class='flag-5'>类</b><b class='flag-5'>库</b>多线程】TaskPool和<b class='flag-5'>Worker</b>的对比

    鸿蒙APP开发:【ArkTS多线程】TaskPool和Worker的对比(2)

    创建Worker的线程称为宿主线程(不定是主线程,工作线程也支持创建Worker子线程),Worker自身的线程称为Worker子线程(或
    的头像 发表于 03-27 15:44 415次阅读
    <b class='flag-5'>鸿蒙</b>APP开发:【ArkTS<b class='flag-5'>类</b><b class='flag-5'>库</b>多线程】TaskPool和<b class='flag-5'>Worker</b>的对比(2)

    鸿蒙语言基础ohos.bytrace 性能打点

    用来标记预追踪的数值变量,该变量的数值会不断变化。
    的头像 发表于 07-18 15:41 169次阅读