HarmonyOS教程指南—如何通过ArkTS使用多线程并发-TaskPool ...

打印 上一主题 下一主题

主题 875|帖子 875|积分 2625

1. TaskPool简介

任务池(TaskPool)作用是为应用步伐提供一个多线程的运行环境,低落整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。
TaskPool支持开发者在主线程封装任务抛给任务队列,系统选择合适的工作线程,进行任务的分发及执行,再将结果返回给主线程。
系统默认会启动一个任务工作线程,当任务较多时会扩容,工作线程数量上限跟当前设备的物理核数相关,具体数量内部管理,保证最优的调理及执行效率,长时间没有任务分发时会缩容,减少工作线程数量。
2.TaskPool留意事项



  • 实现任务的函数需要使用装饰器@Concurrent标注,且仅支持在.ets文件中使用。
  • 任务函数在TaskPool工作线程的执行耗时不能凌驾3分钟(不包罗Promise和async/await异步调用的耗时,例如网络下载、文件读写等I/O任务的耗时),否则会被逼迫退出。
  • 实现任务的函数入参需满足序列化支持的范例,详情请拜见TaskPool和Worker支持的序列化范例。
  • ArrayBuffer参数在TaskPool中默认转移,需要设置转移列表的话可通过接口setTransferList()设置。
  • 由于不同线程中上下文对象是不同的,因此TaskPool工作线程只能使用线程安全的库,例如UI相关的非线程安全库不能使用。
  • 序列化传输的数据量巨细限制为16MB。
3.使用场景

由于TaskPool的工作线程会绑定系统的调理优先级,并且支持负载均衡(自动扩缩容),而Worker需要开发者自行创建,存在创建耗时以及不支持设置调理优先级,故在性能方面使用TaskPool会优于Worker,因此大多数场景推荐使用TaskPool。


  • 需要设置优先级的任务。例如数据在背景计算,计算完成后的数据,在前台界面需要尽快显示,影响用户体验,需要高优先级处理,需要使用TaskPool。
  • 需要频繁取消的任务。例如大图欣赏场景,为提升体验,图片缓存策略,需要使用TaskPool。
  • 大量大概调理分散的任务。例如大型应用的多个模块包罗多个耗时任务,推荐接纳TaskPool。
4.使用限制

TaskPool方向独立任务维度,该任务在线程中执行,无需关注线程的生命周期,超长任务(大于3分钟)会被系统自动接纳。
5.示例

MyTask.ets文件,通过taskpool执行异步任务,读取文件中的内容。
  1. import taskpool from '@ohos.taskpool';
  2. @Concurrent
  3. function readFile(num: number): string {
  4.     return 'hello taskpool '
  5. }
  6. export class MyTask {
  7.     static async handleReadFile(): Promise<string> {
  8.         // 创建Task对象时,传递一个函数引用
  9.         let task = new taskpool.Task(readFile, 2)
  10.         try {
  11.             // 等待 taskpool.execute(task) 解析并获取结果
  12.             let res = await taskpool.execute(task) as string
  13.             console.info(`MyTask handleReadFile ${res}`)
  14.             return res
  15.         } catch (error) {
  16.             // 处理可能出现的错误
  17.             console.error('MyTask execution failed:', error);
  18.             throw error; // 重新抛出错误,或根据需要处理
  19.         }
  20.     }
  21. }
复制代码
在执行任务时,可以指定任务优先级
  1.    function execute(task: Task, priority?: Priority): Promise<unknown>
复制代码
优先级分为三种
  1. enum Priority {
  2.     HIGH,
  3.     MEDIUM,
  4.     LOW
  5. }
复制代码
优先级默认为MEDIUM,如上述代码需要提升任务优先级
  1.     let res = await taskpool.execute(task, taskpool.Priority.HIGH) as string
复制代码
在页面中的调用
  1. Text('当任务不需要长时间(3分钟)占据后台线程,而是一个个独立的任务时,推荐使用TaskPool,反之推荐使用Worker。')
  2.     .width('80%')
  3. Text(`MyTask.handleReadFile:${this.taskRes}`)
  4.     .width('80%')
  5.     .fontColor(Color.Green)
  6. Button('TaskPool-CPU密集型任务')
  7.     .width('80%')
  8.     .onClick(async () => {
  9.         let res = await MyTask.handleReadFile()
  10.         if (typeof res === 'string') {
  11.             this.taskRes = res
  12.         } else {
  13.             this.taskRes = 'error'
  14.         }
  15.     })
复制代码
6.效果


最后

假如你想快速提升鸿蒙技术,那么可以直接领取这份包罗了:【OpenHarmony多媒体技术、Stage模型、ArkUI多端摆设、分布式应用开发、音频、视频、WebGL、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战】等技术知识点。
鸿蒙Next全套VIP学习资料←点击领取!(安全链接,放心点击
1.鸿蒙核心技术学习路线


2.大厂面试必问面试题


3.鸿蒙南向开发技术


 4.鸿蒙APP开发必备


 5.HarmonyOS Next 最新全套视频教程



 6.鸿蒙生态应用开发白皮书V2.0PDF


这份全套完整版的学习资料已经全部打包好,朋侪们假如需要可以点击→鸿蒙Next全套VIP学习资料免费领取(安全链接,放心点击


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表