当前位置: 首页 > news >正文

# 【鸿蒙开发】多线程之Worker的使用

【鸿蒙开发】多线程之Worker的使用


文章目录

  • 【鸿蒙开发】多线程之Worker的使用
  • 前言
  • 一、Worker的介绍
  • 二、注意事项
  • 三、Worker使用示例
    • 1.新建一个Worker
    • 2.主线程使用Worker
    • 3.子线程Worker的使用
  • 四、效果展示


前言

本文主要介绍了多线程的方法之一,使用Worker开启多线程,介绍了如何使用Worker。之前发布过TaskPool的使用,大家可以点击链接查看。
# 【鸿蒙开发】多线程之TaskPool的使用


一、Worker的介绍

Worker 是用于多线程并行任务处理的,能利用多核优势提效。在程序里,主线程管界面交互、任务调度,Worker 线程专注耗时计算或异步操作,像处理大数据、渲染复杂图形、密集网络请求时,让主线程保持灵敏,快速响应操作。Worker最多支持64个多线程,TaskPool没有这个限制。workder是通过onMessage和postMessage发消息实现主线程和子线程的通信的,TaskPool是通过参数的方式进行通信。

二、注意事项

1、及时关闭 Worker:开发者要清楚,Worker 完成任务后,得手动关闭,如果不关闭,资源会一直被占用,导致系统性能下降,甚至可能内存泄漏。
2、避免主线程卡顿:Worker 在多线程编程里很重要,主要负责处理耗时任务,像大数据处理、频繁网络请求等。它能帮主线程分担压力,让主线程专注用户交互与任务调度,快速响应操作
3、谨慎共享资源:虽然 Worker 线程和主线程能共享部分资源,但开发时不能过度依赖。多个 Worker 线程同时读写同一共享资源,容易混乱,导致数据出错、不一致,尽量给 Worker 配独立资源。

三、Worker使用示例

1.新建一个Worker

在这里插入图片描述

2.主线程使用Worker

Worker是通过onMessage和postMessage进行主线程和子线程通信的

  //worker的使用getWorker() {const work1 = new worker.ThreadWorker("entry/ets/workers/Worker.ets")work1.postMessage(123) //主线程给子线程发消息//主线程接收消息work1.onmessage = (event) => {// event.data-可以拿到子线程发送的消息AlertDialog.show({ message: '收到子线程发的消息' + JSON.stringify(event)})work1.terminate() //worker需要自毁或者再Workers那执行workerPort.close()}}

主线程完整代码:

import { worker } from '@kit.ArkTS';@Entry
@Component
struct Index {aboutToAppear(): void {this.getWorker()}//worker的使用getWorker() {const work1 = new worker.ThreadWorker("entry/ets/workers/Worker.ets")work1.postMessage(123) //主线程给子线程发消息//主线程接收消息work1.onmessage = (event) => {// event.data-可以拿到子线程发送的消息AlertDialog.show({ message: '收到子线程发的消息' + JSON.stringify(event) })work1.terminate() //worker需要自毁或者再Workers那执行workerPort.close()}}build() {RelativeContainer() {}.height('100%').width('100%')}
}

注意事项:本次演示代码路径
在这里插入图片描述
如果代码测试请求数据,注意在modules.json5中开启网络权限
在这里插入图片描述

3.子线程Worker的使用

子线程创建时会生成代码,我们在workerPort.onmessage中处理和主线程的通信即可。

workerPort.onmessage = async (e: MessageEvents) => {// e.data  可以拿到主线程传的消息console.log(' 接收到主线程发来的消息-----> ', e.data)const req = http.createHttp()const res = await req.request('https://xxx/home/banner')//子线程给主线程发消息--将请求结果返回workerPort.postMessage(JSON.stringify(res))// 如果主线程没有关闭worker,主线程可以让worker自焚// workerPort.close() //自毁
}

子线程完整代码:

import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
import { http } from '@kit.NetworkKit';const workerPort: ThreadWorkerGlobalScope = worker.workerPort;/*** Defines the event handler to be called when the worker thread receives a message sent by the host thread.* The event handler is executed in the worker thread.** @param e message data*/
workerPort.onmessage = async (e: MessageEvents) => {// e.data  可以拿到主线程传的消息console.log(' 接收到主线程发来的消息-----> ', e.data)// AlertDialog.show({ message: '接收到主线程发来的消息:' + e.data, alignment: DialogAlignment.Center })const req = http.createHttp()const res = await req.request('https://xxx/home/banner')//子线程给主线程发消息--将请求结果返回workerPort.postMessage(JSON.stringify(res))// 如果主线程没有关闭worker,主线程可以让worker自焚// workerPort.close() //自毁
}/*** Defines the event handler to be called when the worker receives a message that cannot be deserialized.* The event handler is executed in the worker thread.** @param e message data*/
workerPort.onmessageerror = (e: MessageEvents) => {
}/*** Defines the event handler to be called when an exception occurs during worker execution.* The event handler is executed in the worker thread.** @param e error message*/
workerPort.onerror = (e: ErrorEvent) => {
}

注意事项:
子线程在创建Worker时会自动生成文件,在生成的文件中处理逻辑。
在这里插入图片描述

四、效果展示

本次示例子线程给主线程发送了一个请求结果,我们用的是弹窗的形式展示
在这里插入图片描述
主线程给子线程发消息用的是控制台打印
在这里插入图片描述

相关文章:

# 【鸿蒙开发】多线程之Worker的使用

【鸿蒙开发】多线程之Worker的使用 文章目录 【鸿蒙开发】多线程之Worker的使用前言一、Worker的介绍二、注意事项三、Worker使用示例1.新建一个Worker2.主线程使用Worker3.子线程Worker的使用 四、效果展示 前言 本文主要介绍了多线程的方法之一,使用Worker开启多…...

TKG-DM – 基于Latent Diffusion模型的“原生”色度提取生成具有透明通道的图像

概述 原文地址:https://www.unite.ai/improving-green-screen-generation-for-stable-diffusion/ 论文地址:https://arxiv.org/pdf/2411.15580 尽管社区研究和投资者对图像生成人工智能充满热情,但此类系统的输出并不总是可以直接用于产品开…...

告别 Windows 迟缓!多维度优化策略开启流畅新体验

在日常使用 Windows 系统的过程中,随着时间推移和软件安装卸载,系统可能会出现运行缓慢、卡顿等问题。本文中简鹿办公将详细介绍一系列 Windows 系统优化方法,涵盖多个关键层面,助力您的电脑重焕生机。 一、磁盘清理与优化 磁盘…...

亚马逊国际站商品爬虫:Python实战指南

在数字化时代,数据的价值不言而喻。对于电商领域而言,获取竞争对手的商品信息、价格、评价等数据,对于市场分析和策略制定至关重要。本文将带你了解如何使用Python编写爬虫,以亚马逊国际站为例,按照关键字搜索并获取商…...

RabbitMQ基础篇之Java客户端快速入门

文章目录 需求 项目设置与依赖管理 配置RabbitMQ的连接信息创建队列与消息发送创建消费者(消息接收)环境准备与操作 需求 利用控制台创建队列 simple.queue在 publisher 服务中,利用 SpringAMQP 直接向 simple.queue 发送消息在 consumer 服…...

深度学习:基于MindSpore NLP的数据并行训练

什么是数据并行? 数据并行(Data Parallelism, DP)的核心思想是将大规模的数据集分割成若干个较小的数据子集,并将这些子集分配到不同的 NPU 计算节点上,每个节点运行相同的模型副本,但处理不同的数据子集。…...

Qt6之QML——枚举

在 QML 中,枚举 (Enumeration) 是一种用于定义一组固定值的功能。通过枚举,可以便捷地提供一组可选值,使用更加明确和精简。 一、枚举的特点 固定值定义: 枚举可以预先定义一组字面值,通常用于需要定义限制值范围的场景…...

ModiLeo交易平台:引领数字货币交易新未来

在当今数字化高速发展的时代,数字货币作为一种新兴的金融资产形式,正逐渐改变着全球金融格局。而此刻,由印度 ModiLeo 实验室联合全球顶级投行共同打造的全球领先的一站式数字货币交易平台——ModiLeo 即将上线,这无疑是数字货币领…...

[python SQLAlchemy数据库操作入门]-15.联合查询,跨表获取股票数据

哈喽,大家好,我是木头左! 在开始探讨如何利用SQLAlchemy实现复杂的联合查询之前,首先需要深入理解其核心组件——对象关系映射(ORM)。ORM允许开发者使用Python类来表示数据库中的表,从而以一种更直观、面向对象的方式来操作数据库。 SQLAlchemy中的JOIN操作详解 在SQLA…...

某网站手势验证码识别深入浅出(全流程)

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/20 本篇文章包含经验和教训总结,我采用了两种方法进行识别,两种方法都各有优劣,其中一…...

在虚幻引擎4(UE4)中使用蓝图的详细教程

在虚幻引擎4(UE4)中使用蓝图的详细教程 虚幻引擎4(Unreal Engine 4,简称UE4)是一款功能强大的游戏引擎,广泛应用于游戏开发、虚拟现实、建筑可视化等领域。UE4 提供了一个强大的可视化脚本工具——蓝图&am…...

Junit如何禁用指定测试类,及使用场景

在JUnit中禁用指定测试类可以通过多种方式实现,具体取决于使用的JUnit版本(JUnit 4 或 JUnit 5)。以下是针对两个版本的详细说明以及它们可能的使用场景: JUnit 4 禁用整个测试类 可以使用Ignore注解来忽略整个测试类。这将导致…...

ICLR2015 | FGSM | 解释并利用对抗样本

Explaining and Harnessing Adversarial Examples 摘要-Abstract相关工作-Related Work对抗样本的线性解释-The Linear Explanation of Adversarial Examples非线性模型的线性扰动-Linear Pertubation of Non-Linear Models线性模型与权重衰减的对抗训练-Adversarial Training …...

Python 迭代器与生成器

Python 中的迭代器和生成器是处理集合元素的重要工具,它们在处理大量数据时特别有用,因为它们不需要一次性将所有数据加载到内存中。 迭代器(Iterator) 迭代器是一个实现了迭代器协议的对象,这意味着它有两个方法&am…...

MySQL数据库——索引结构之B+树

本文先介绍数据结构中树的演化过程,之后介绍为什么MySQL数据库选择了B树作为索引结构。 文章目录 树的演化为什么其他树结构不行?为什么不使用二叉查找树(BST)?为什么不使用平衡二叉树(AVL树)&a…...

3_TCP/IP连接三次握手与断开四次挥手

TCP/IP 通信是网络通信的基础协议,分为以下主要步骤: 1、建立连接(三次握手) 目的:保证双方建立可靠的通信连接。 过程: 1>客户端发送 SYN:客户端向服务器发送一个 SYN(同步&…...

【LC】3159. 查询数组中元素的出现位置

题目描述: 给你一个整数数组 nums ,一个整数数组 queries 和一个整数 x 。 对于每个查询 queries[i] ,你需要找到 nums 中第 queries[i] 个 x 的位置,并返回它的下标。如果数组中 x 的出现次数少于 queries[i] ,该查…...

《机器学习》——KNN算法

文章目录 KNN算法简介KNN算法——sklearnsklearn是什么?sklearn 安装sklearn 用法 KNN算法 ——距离公式KNN算法——实例分类问题完整代码——分类问题 回归问题完整代码 ——回归问题 KNN算法简介 一、KNN介绍 全称是k-nearest neighbors,通过寻找k个距…...

GAMES101:现代计算机图形学入门-作业五

作业五 这次作业给了许多脚本,我们现在可以把每个脚本的代码逐行细细分析一下。 main.cpp #include "Scene.hpp" #include "Sphere.hpp" #include "Triangle.hpp" #include "Light.hpp" #include "Renderer.hpp&quo…...

GPU 进阶笔记(二):华为昇腾 910B GPU

大家读完觉得有意义记得关注和点赞!!! 1 术语 1.1 与 NVIDIA 术语对应关系1.2 缩写2 产品与机器 2.1 GPU 产品2.2 训练机器 底座 CPU功耗操作系统2.3 性能3 实探:鲲鹏底座 8*910B GPU 主机 3.1 CPU3.2 网卡和网络3.3 GPU 信息 3.3…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...