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

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

3天内不再提示

鸿蒙OS开发实例:【ArkTS类库多线程I/O密集型任务开发】

jf_46214456 2024-04-01 16:32 次阅读

使用异步并发可以解决单次I/O任务阻塞的问题,但是如果遇到I/O密集型任务,同样会阻塞线程中其它任务的执行,这时需要使用多线程并发能力来进行解决。

I/O密集型任务的性能重点通常不在于CPU的处理能力,而在于I/O操作的速度和效率。这种任务通常需要频繁地进行磁盘读写、网络通信等操作。此处以频繁读写系统文件来模拟I/O密集型并发任务的处理。

定义并发函数,内部密集调用I/O能力。

import fs from '@ohos.file.fs';

// 定义并发函数,内部密集调用I/O能力
@Concurrent
async function concurrentTest(fileList: string[]) {
  // 写入文件的实现
  async function write(data, filePath) {
    let file = await fs.open(filePath, fs.OpenMode.READ_WRITE);
    await fs.write(file.fd, data);
    fs.close(file);
  }
  // 循环写文件操作
  for (let i = 0; i < fileList.length; i++) {
    write('Hello World!', fileList[i]).then(() = > {
      console.info(`Succeeded in writing the file. FileList: ${fileList[i]}`);
    }).catch((err) = > {
      console.error(`Failed to write the file. Code is ${err.code}, message is ${err.message}`)
      return false;
    })
  }
  return true;
}

开始前熟悉鸿蒙文档

鸿蒙OS开发更多内容↓点击HarmonyOSOpenHarmony技术
鸿蒙技术文档《鸿蒙NEXT星河版开发学习文档》

搜狗高速浏览器截图20240326151450.png

使用TaskPool执行包含密集I/O的并发函数:通过调用execute()方法执行任务,并在回调中进行调度结果处理。示例中的filePath1和filePath2的获取方式请参见获取应用文件路径。

import taskpool from '@ohos.taskpool';

let filePath1 = ...; // 应用文件路径
let filePath2 = ...;

// 使用TaskPool执行包含密集I/O的并发函数
// 数组较大时,I/O密集型任务任务分发也会抢占主线程,需要使用多线程能力
taskpool.execute(concurrentTest, [filePath1, filePath2]).then((ret) = > {
  // 调度结果处理
  console.info(`The result: ${ret}`);
})

本文参考引用HarmonyOS官方开发文档,基于API9。

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

    关注

    0

    文章

    277

    浏览量

    19891
  • 鸿蒙
    +关注

    关注

    57

    文章

    2301

    浏览量

    42668
  • 鸿蒙OS
    +关注

    关注

    0

    文章

    188

    浏览量

    4353
收藏 人收藏

    评论

    相关推荐

    鸿蒙开发:【线程模型】

    管理其他线程ArkTS引擎实例,例如使用TaskPool(任务池)创建任务或取消任务、启动和终
    的头像 发表于 06-13 16:38 327次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>:【<b class='flag-5'>线程</b>模型】

    鸿蒙OS开发实例:【ArkTS单次I/O任务开发

    Promise和async/await提供异步并发能力,适用于单次I/O任务的场景开发,本文以使用异步进行单次文件写入为例来提供指导。
    的头像 发表于 04-02 21:03 278次阅读
    <b class='flag-5'>鸿蒙</b>原<b class='flag-5'>OS</b><b class='flag-5'>开发</b><b class='flag-5'>实例</b>:【<b class='flag-5'>ArkTS</b><b class='flag-5'>类</b><b class='flag-5'>库</b>单次<b class='flag-5'>I</b>/<b class='flag-5'>O</b><b class='flag-5'>任务</b><b class='flag-5'>开发</b>】

    鸿蒙OS开发实例:【ArkTS多线程@Concurrent装饰器校验并发函数】

    在使用TaskPool时,执行的并发函数需要使用该装饰器修饰,否则无法通过相关校验。从API version 9开始,该装饰器支持在ArkTS卡片中使用。
    的头像 发表于 04-02 14:45 553次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>OS</b><b class='flag-5'>开发</b><b class='flag-5'>实例</b>:【<b class='flag-5'>ArkTS</b><b class='flag-5'>类</b><b class='flag-5'>库</b><b class='flag-5'>多线程</b>@Concurrent装饰器校验并发函数】

    鸿蒙OS开发实例:【ArkTS多线程CPU密集型任务TaskPool】

    CPU密集型任务是指需要占用系统资源处理大量计算能力的任务,需要长时间运行,这段时间会阻塞线程其它事件的处理,不适宜放在主线程进行。例如图像
    的头像 发表于 04-01 22:25 758次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>OS</b><b class='flag-5'>开发</b><b class='flag-5'>实例</b>:【<b class='flag-5'>ArkTS</b><b class='flag-5'>类</b><b class='flag-5'>库</b><b class='flag-5'>多线程</b>CPU<b class='flag-5'>密集型</b><b class='flag-5'>任务</b>TaskPool】

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

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

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

    并发模型是用来实现不同应用场景中并发任务的编程模型,常见的并发模型分为基于内存共享的并发模型和基于消息通信的并发模型。 Actor并发模型作为基于消息通信并发模型的典型代表,不需要开发者去面对锁带来
    发表于 03-28 14:35

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

    TaskPool(任务池)和Worker的作用是为应用程序提供一个多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这
    的头像 发表于 03-26 22:09 546次阅读
    <b class='flag-5'>鸿蒙</b>APP<b class='flag-5'>开发</b>:【<b class='flag-5'>ArkTS</b><b class='flag-5'>类</b><b class='flag-5'>库</b><b class='flag-5'>多线程</b>】TaskPool和Worker的对比

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

    TaskPool运作机制 图1 TaskPool运作机制示意图 TaskPool支持开发者在主线程封装任务抛给任务队列,系统选择合适的工作线程
    发表于 03-26 15:25

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

    TaskPool(任务池)和Worker的作用是为应用程序提供一个多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这
    发表于 03-25 14:11

    鸿蒙原生应用开发-ArkTS语言基础多线程I/O密集型任务开发

    使用异步并发可以解决单次I/O任务阻塞的问题,但是如果遇到I/O密集型
    发表于 03-21 14:57

    鸿蒙原生应用开发-ArkTS语言基础多线程CPU密集型任务TaskPool

    CPU密集型任务是指需要占用系统资源处理大量计算能力的任务,需要长时间运行,这段时间会阻塞线程其它事件的处理,不适宜放在主线程进行。例如图像
    发表于 03-19 14:14

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

    ArkTS语言基础是HarmonyOS系统上为应用开发者提供的常用基础能力,主要包含能力如下图所示。 1.提供异步并发和多线程并发的能
    发表于 03-05 15:42

    鸿蒙原生应用开发-ArkTS语言基础单次I/O任务开发

    Promise和async/await提供异步并发能力,适用于单次I/O任务的场景开发,本文以使用异步进行单次文件写入为例来提供指导。 实现单次I
    发表于 03-04 14:07

    ArkTS语言基础-解析

    ArkTS语言基础是HarmonyOS系统上为应用开发者提供的常用基础能力,主要包含能力如下图所示。 图1 ArkTS语言基础
    发表于 02-20 16:44

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

    一、CPU密集型任务开发指导 CPU密集型任务是指需要占用系统资源处理大量计算能力的任务,需要长
    的头像 发表于 02-18 10:17 932次阅读
    HarmonyOS CPU与<b class='flag-5'>I</b>/<b class='flag-5'>O</b><b class='flag-5'>密集型</b><b class='flag-5'>任务</b><b class='flag-5'>开发</b>指导