鸿蒙 harmonyos 线程 并发 总结 async promise Taskpool woker(二)多线程并发 Taskpool

多线程并发

并发模型是用来实现不同应用场景中并发任务的编程模型,常见的并发模型分为基于内存共享的并发模型和基于消息通信的并发模型。

ArkTS提供了TaskPool和Worker两种并发能力供开发者选择,其具体的实现特点和各自的适用场景存在差异。TaskPool(任务池)和Worker的作用是为应用程序提供一个多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这些任务阻塞主线程,从而最大化系统的利用率,降低整体资源消耗,并提高系统的整体性能。

TaskPool和Worker的对比

表1 TaskPool和Worker的实现特点对比

实现

TaskPool

Worker

内存模型

线程间隔离,内存不共享。

线程间隔离,内存不共享。

参数传递机制

采用标准的结构化克隆算法(Structured Clone)进行序列化、反序列化,完成参数传递。

支持ArrayBuffer转移和SharedArrayBuffer共享。

采用标准的结构化克隆算法(Structured Clone)进行序列化、反序列化,完成参数传递。

支持ArrayBuffer转移和SharedArrayBuffer共享。

参数传递

直接传递,无需封装,默认进行transfer。

消息对象唯一参数,需要自己封装。

方法调用

直接将方法传入调用。

在Worker线程中进行消息解析并调用对应方法。

返回值

异步调用后默认返回。

主动发送消息,需在onmessage解析赋值。

生命周期

TaskPool自行管理生命周期,无需关心任务负载高低。

开发者自行管理Worker的数量及生命周期。

任务池个数上限

自动管理,无需配置。

同个进程下,最多支持同时开启8个Worker线程。

任务执行时长上限

无限制。

无限制。

设置任务的优先级

不支持。

不支持。

执行任务的取消

支持取消任务队列中等待的任务。

不支持。

适用场景对比

TaskPool和Worker均支持多线程并发能力。TaskPool偏向独立任务维度,该任务在线程中执行,无需关注线程的生命周期;而Worker偏向线程的维度,支持长时间占据线程执行,需要主动管理线程生命周期。

常见的一些开发场景及适用具体说明如下:

  • 有关联的一系列同步任务。例如在一些需要创建、使用句柄的场景中,句柄创建每次都是不同的,该句柄需永久保存,保证使用该句柄进行操作,需要使用Worker。
  • 需要频繁取消的任务。例如图库大图浏览场景,为提升体验,会同时缓存当前图片左右侧各2张图片,往一侧滑动跳到下一张图片时,要取消另一侧的一个缓存任务,需要使用TaskPool。
  • 大量或者调度点较分散的任务。例如大型应用的多个模块包含多个耗时任务,不方便使用8个Worker去做负载管理,推荐采用TaskPool。

taskpool

taskpool,通过管理Task进行多线程的,通过taskpool.execute执行的,返回Promise对象。

Task的构造方法Task(func,args),func是执行的函数,该函数func需要用@Concurrent装饰器进行装饰,否则不会通过验证。

taskpool是可以通过taskpool.cancel结束Task任务的,也算是一种管理吧。

@Concurrent仅支持在Stage模型中使用,args是func的参数。@Concurrent装饰器不能在控件中声明。

taskpool.Task是有优先级的,执行的时候通过taskpool.Priority.HIGH标记优先级的

@Concurrent
function func(args) {console.log("func: " + args);return args;
}const task: taskpool.Task = new taskpool.Task(func,"kang");
taskpool.execute(task, taskpool.Priority.HIGH);
taskpool.cancel(task);

执行Task后想获得其结果,可以用async/awaite获取

@Concurrent
function func(args) {console.log("func: " + args);return args;
}async function taskpoolTest() {let task = new taskpool.Task(func, 100);let value = await taskpool.execute(task);console.log("taskpool result: " + value);
}taskpoolTest();

taskpool实际应用

CPU密集型任务是指需要占用系统资源处理大量计算能力的任务,需要长时间运行,这段时间会阻塞线程其它事件的处理,不适宜放在主线程进行。例如图像处理、视频编码、数据分析等。

基于多线程并发机制处理CPU密集型任务可以提高CPU利用率,提升应用程序响应速度。

示例:

import taskpool from '@ohos.taskpool';@Concurrent
function imageProcessing(dataSlice: ArrayBuffer) {// 步骤1: 具体的图像处理操作及其他耗时操作return dataSlice;
}function histogramStatistic(pixelBuffer: ArrayBuffer) {// 步骤2: 分成三段并发调度let number = pixelBuffer.byteLength / 3;let buffer1 = pixelBuffer.slice(0, number);let buffer2 = pixelBuffer.slice(number, number * 2);let buffer3 = pixelBuffer.slice(number * 2);let task1 = new taskpool.Task(imageProcessing, buffer1);let task2 = new taskpool.Task(imageProcessing, buffer2);let task3 = new taskpool.Task(imageProcessing, buffer3);taskpool.execute(task1).then((ret: ArrayBuffer[]) => {// 步骤3: 结果处理});taskpool.execute(task2).then((ret: ArrayBuffer[]) => {// 步骤3: 结果处理});taskpool.execute(task3).then((ret: ArrayBuffer[]) => {// 步骤3: 结果处理});
}@Entry
@Component
struct Index {@State message: string = 'Hello World'build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {let data: ArrayBuffer;histogramStatistic(data);})}.width('100%')}.height('100%')}
}

今天关于并发的就先写到这,下一篇woker

本人创业失败,要找工作,想找一个鸿蒙开发的工作,要我的请私信我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/1999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据科学与大数据(3)

数据分析,它不应该是在一个不适合的工具下生搬硬套 工具为具体的场景服务,换一个场景大概率会很鸡肋,对于一个成熟的分析师来说,十八般武艺样样精通到后期为常态,不要产生工具上的路径依赖,不要想着学一个工…

IDEA更换新版本启动没反应

目前安装了新的IDEA(压缩包方式),由于老版本的IDEA还在用,所以并没有删除,但是安装完后发现点击idea64.exe后没有反应,于是网上找了好多方法最后解决了 下面是我的解决过程 新版本:IntelliJIdea2024.1 老版本: Intelli…

v-for和v-if的优先级

在vue v-for和 v-if 的优先级不同。 一般情况下,v-if 的优先级高于 v-for。这意味着,如果在同一元素上同时使用 v-if 和 v-for,v-if 的条件判断会先执行。 这种优先级的原因是为了避免不必要的渲染开销。如果先执行 v-for 循环,…

ubuntu系统安装配置gitlab+Jenkins+发布持续集成持续部署保姆级教程。

1、服务器环境 名称 系统 IP 备注 gitlab ubuntu20.04.2图形化 192.168.26.130 要求有6G的内存 Jenkins Ubuntu20.04.2图形化 …

.NET/C#汇总 —— 数据库概念知识

1 为什么要⼀定要设置主键? 其实这个不是⼀定的,有些场景下,⼩系统或者没什么⽤的表,不设置主键也没关系,mysql最好是⽤ ⾃增主键,主要是以下两个原因:如果定义了主键,那么InnoDB会选择主键作为聚集索引、如果没有显 式定义主键,则innodb 会选择第⼀个不包含有NULL值…

Pytorch下张量的形状操作(详细)

目录 一、基本操作函数 二、分类:维度改变,张量变形,维度重排 2.1维度改变 2.2张量变形 2.3维度重排 三、实例 一、基本操作函数 在PyTorch中,对张量的形状进行操作是常见的需求,因为它允许我们重新组织、选择和…

大模型训练及推理【硬件选型指南】及 GPU 通识

我们在做大模型应用部署时(如训练、微调、RAG),往往需要在前期就分析好硬件选型指标,或者我们给客户报方案之前,可能你已经有了一个方案,但是由于实践经验缺乏,不知道在硬件上该如何评估并上报。…

CTF练习-BUUCTF(1~25)

文章目录 Crypto题目1 一眼就解密题目解题思路flag 题目2 md5题目解题思路flag 题目3 Url编码题目解题思路flag 题目4 看我回旋踢题目解题思路1解题思路2flag 题目5 摩丝题目解题思路flag 题目6 passwd题目解题思路flag 题目7 变异凯撒题目解题思路flag 题目8 Quoted-printable…

AJAX——封装_简易axios

1.简易axios_获取身份列表 需求:基于Promise XHR 封装 myAxios函数,获取省份列表展示 步骤: 1.定义 myAxios函数,接收配置对象,返回Promise对象 2.发起XHR请求,默认请求方法为GET 3.调用成功/失败的处…

大模型日报2024-04-22

大模型日报 2024-04-22 大模型资讯 Mistral与Mixtral大型语言模型对比:7B、8x7B及8x22B 摘要: 最近,IT新闻频道广泛报道了新公开的Mixtral 8x22B模型,该模型在多项基准测试中超越了ChatGPT 3.5版本,尤其在MMLU等测试中表现突出。本…

Rust语言之简单涉猎

官方文档 简介 Rust 是一种静态类型语言。静态类型语言是指在编译时对变量和表达式进行类型检查,以确保类型的正确性。在 Rust 中,每个变量都需要在声明时指定其类型(也支持隐式声明,根据值判断),并且在编译时会进行类型检查&am…

更全面的Embedding介绍

"Embedding"这个词在不同的上下文中有多种含义,以下是一些常见的解释: 计算机科学和人工智能:在机器学习和自然语言处理中,embedding是一种将词汇或短语映射到向量空间的技术。这些向量可以捕捉到词汇的语义含义&#x…

java中spring底层核心原理解析(2)

相关系列 java中spring底层核心原理解析(1)-CSDN博客 推断构造方法 spring在基于某个类生成bean的过程中,需要利用该学业有成的构造方法来实例化得到一个对象,但是如果一个类存在多个构造方法,spring会使用哪个呢? …

Python与数据库连接

新建表boss create table 创建表 Code import pymysqlcon pymysql.connect(hostlocalhost,\userroot,\password,\port3306,\dbbusiness) cursorcon.cursor() cursor.execute(create table if not exists boss(id int auto_increment primary key,name varchar(20)not null…

设计模式|代理模式(Proxy Pattern)

文章目录 什么是代理模式举例结构优缺点优点缺点代码示例与代理模式相近的设计模式什么是代理模式 代理模式(Proxy Pattern)是一种结构型设计模式,它允许你提供一个间接访问对象的方式,以控制对对象的访问。这种模式通常在不改变原始类代码的情况下,添加一些额外的逻辑或…

WPF2 样式布局

样式布局 WPF中的各类控件元素, 都可以自由的设置其样式。 诸如: 字体(FontFamily) 字体大小(FontSize) 背景颜色(Background) 字体颜色(Foreground) 边距(Margin) 水平位置(HorizontalAlignment) 垂直位置(VerticalAlignment) 等等。 而样式则是组织和重用以上的重要工具。…

Docker基础+虚拟化概念

目录 一、虚拟化简介 1、虚拟化概述 2、cpu的时间分片(cpu虚拟化) 3、cpu虚拟化性性能瓶颈 4、虚拟化工作 4.1虚拟机工作原理 4.2两大核心组件:QEMU、KVM 4.2.1QEMU: 4.2.2KVM: 5、虚拟化类型 ①全虚拟化: …

MySQL-数据目录

一、MySQL的主要目录结构(MySQL 8) [rootlocalhost ~]# find / -name mysql find: ‘/proc/30845’: 没有那个文件或目录 find: ‘/proc/30855’: 没有那个文件或目录 /etc/logrotate.d/mysql /etc/selinux/targeted/active/modules/100/mysql /etc/sel…

国内开通chatgpt plus会员方法

ChatGPT镜像 今天在知乎看到一个问题:“平民不参与内测的话没有账号还有机会使用ChatGPT吗?” 从去年GPT大火到现在,关于GPT的消息铺天盖地,真要有心想要去用,途径很多,别的不说,国内GPT的镜像…

微软如何打造数字零售力航母系列科普02 --- 微软低代码应用平台加速企业创新 - 解放企业数字零售力

微软低代码应用平台推动企业创新- 解放企业数字零售力 微软在2023年GARTNER发布的魔力象限图中处于头部领先(leader)地位。 其LCAP产品是Microsoft Power Apps,扩展了AI Builder、Dataverse、Power Automate和Power Pages,这些都包…