首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
软件与程序人生
›
移动端开发
›
鸿蒙
›
鸿蒙 harmonyos 线程 并发 总结 async promise Taskpool ...
返回列表
发新帖
鸿蒙 harmonyos 线程 并发 总结 async promise Taskpool woker(三)多线程
[复制链接]
发表于 2024-9-26 04:35:16
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
Worker
Worker是与主线程并行的独立线程。创建Worker的线程称之为宿主线程,Worker自身的线程称之为Worker线程。创建Worker传入的url文件在Worker线程中执行,可以处置处罚耗时操作但不可以直接操作UI。
Worker主要作用是为应用步伐提供一个多线程的运行环境,可满足应用步伐在执行过程中与主线程分离,在背景线程中运行一个脚本操作耗时操作,极大避免类似于盘算麋集型或高延迟的使命阻塞主线程的运行。由于Worker一旦被创建则不会主动被烧毁,若不处于使命状态一直运行,在肯定程度上会造成资源的浪费,应及时关闭空闲的Worker。
当进行一系列同步使命时,保举使用Worker;而进行大量或调理点较为分散的独立使命时,不方便使用8个Worker去做
负载
管理,保举采用TaskPool。接下来将以图像直方图处置处罚以及背景长时间的模型预测使命分别进行举例。
Worker的上下文对象和主线程的上下文对象是不同的,Worker线程不支持UI操作
。
Worker留意事项
创建Worker时,传入的Worker.ts路径在不同
版本
有不同的规则,详情请参见文件路径留意事项。
Worker创建后必要手动管理生命周期,且最多同时运行的Worker子线程数目为8个,详情请参见生命周期留意事项。
Ability类型的Module支持使用Worker,Library类型的Module不支持使用Worker。
创建Worker不支持使用其他Module的Worker.ts文件,即不支持跨模块调用Worker。
由于不同线程中上下文对象是不同的,因此Worker线程只能使用线程
安全
的库,比方UI相关的非线程
安全
库不能使用。
序列化传输的数据量巨细限制为16MB。
创建Worker
由于华为主推Stage模型以是这里讲解Stage模型的Woker,构造函数必要传入Worker的路径(scriptURL),Worker文件存放位置默认路径为Worker文件所在目录与pages目录属于同级。
基于Stage模型工程目录布局,写法一的路径含义:
entry:module.json5文件中module的name属性对应值。
ets:用于存放ets源码,固定目录。
workers/MyWorker.ts:worker源文件在ets目录下的路径。
基于Stage模型工程目录布局,写法二的路径含义:
@bundle:固定标签。
bundlename:当前应用包名。
entryname:module.json5文件中module的name属性对应值。
ets:用于存放ets源码,固定目录。
workerdir/workerfile:worker源文件在ets目录下的路径,可不带文件后缀名。
在pages创建workers文件夹,在workers中创建worker文件,js、ts、ets都可以。本例创建的是ets,为了寻求
代码
统一。
worker通过worker.workerPort与主线程通讯,workerPort.onmessage接收来自主线程的数据,workerPort.postMessage向主线程发送消息。
// worker.ts
import worker from '@ohos.worker';
// 创建worker线程中与主线程通信的对象
const workerPort = worker.workerPort
// worker线程接收主线程信息
workerPort.onmessage = function(e) {
// data:主线程发送的信息
let data = e.data;
console.log("worker.ts onmessage"+data);
// worker线程向主线程发送信息
workerPort.postMessage("123")
}
// worker线程发生error的回调
workerPort.onerror= function(e) {
console.log("worker.ts onerror");
}
复制
代码
配置
Woker
必要在build-profile.json5中
配置
worker路径,
配置
在buildOption中的sourceOption中添加workers数组,既然是数组就可以添加多个worker
"buildOption": {
"sourceOption": {
"workers": [
"./src/main/ets/workers/worker.ets"
]
}
}
复制
代码
调用Worker
worker.ThreadWorker("path/worker.ts")创建Woker对象,onmessage接收来worker的数据,postMessage向worker发送消息。
import worker from '@ohos.worker';
@Entry
@Component
struct Index {
@State image: PixelMap | undefined = undefined;
@State message: string = 'Hello World';
testWoker(){
// 主线程中创建Worker对象
const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.ts");
// 创建js和ts文件都可以
// const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.js");
// 主线程向worker线程传递信息
workerInstance.postMessage("123");
// 主线程接收worker线程信息
workerInstance.onmessage = function(e) {
// data:worker线程发送的信息
let data = e.data;
console.log("main.js onmessage");
// 销毁Worker对象
workerInstance.terminate();
}
// 在调用terminate后,执行onexit
workerInstance.onexit = function() {
console.log("main.js terminate");
}
}
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(()=>{
this.testWoker();
})
}
.width('100%')
}
.height('100%')
}
}
复制代码
今天就写到这,下一章讲一下worker其他特性,另有同步问题。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
返回列表
张国伟
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表