HarmonyOS Promise & taskpool使用问题

关于Promise的使用我们存在以下问题和疑问。

1、Promise 下去调用 async ,它的耗时明显比UI线程调用还要长很多,请问这是怎么回事,是否是个bug。

示例代码:

async initDb(){  
  let startTime = Date.now()  
  await db.init()  
  let now = Date.now()  
  LogUtils.info(TAG,"耗时:"+(now-startTime))  
}

- 主线程运行initDB耗时:30ms

- Promise里耗时运行耗时:105ms

2、当数量较大的Promise同时启动,它的原理是怎么样的,对性能或者主线程的渲染会有什么影响,我们测试了一下它似乎是按顺序执行的,是否有线程池的概念,我们打印了执行方法,它并不是主线程。

3、taskpool下调用Promise和主线程调用Promise有什么区别。

HarmonyOS
2024-10-25 12:10:06
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
superinsect

Promise提供异步并发能力,异步代码会被挂起并在之后继续执行,同一时间只有一段代码执行,适用于单次I/O任务的场景开发,例如一次网络请求、一次文件读写等操作。

HarmonyOS 的Promise任务可以理解为类似协程执行,Promise会阻塞主线程,所以在主线程中执行会比在Promise中执行耗时更短。

任务池(TaskPool)作用是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,一般用于处理耗时的计算任务或其他密集型任务,TaskPool支持开发者在主线程封装任务抛给任务队列,系统选择合适的工作线程,进行任务的分发及执行,再将结果(结果是一个Promise对象)返回给主线程。

TaskPool偏向独立任务(线程级)维度,超长任务(大于3分钟)会被系统自动回收;而Worker偏向线程的维度,支持长时间占据线程执行。

异步处理操作主要有Promise、Work线程、TaskPool任务池三种方式。

HarmonyOS应用中每个进程都会有一个主线程,除主线程外,还有一类与主线程并行的独立线程Worker,主要用于执行耗时操作,最多可以创建7个Worker。

一般情况下,如果调用的API有异步接口,不是特别耗时,不阻塞程序后续执行,可使用Promise进行异步操作。

若操作非常耗时,可创建Worker处理耗时操作。

TaskPool主要是为应用程序提供一个多线程的运行环境,不建议在任务中执行阻塞操作,特别是无限期阻塞操作,长时间的阻塞操作占据工作线程,可能会阻塞其他任务调度,影响应用性能。

更多异步和并发方面资料您请参考:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/2_2_u5e76_u53d1-0000001774279762-V5

分享
微博
QQ
微信
回复
2024-10-25 15:24:13
相关问题
HarmonyOS关于异步Promise使用问题
437浏览 • 1回复 待解决
HarmonyOS taskpool使用问题咨询
147浏览 • 1回复 待解决
taskpool 使用问题,有人知道吗?
891浏览 • 1回复 待解决
HarmonyOS 关于taskpool问题
201浏览 • 1回复 待解决
HarmonyOS taskpool使用crash
1396浏览 • 2回复 待解决
HarmonyOS taskpool数据传输问题
465浏览 • 1回复 待解决
HarmonyOS 使用worker和TaskPool咨询
159浏览 • 1回复 待解决
关于HarmonyOS Promise机制
366浏览 • 1回复 待解决
JS中如何使用Promise和async await
664浏览 • 1回复 待解决
HarmonyOS TaskPool使用首选项报错
422浏览 • 1回复 待解决
使用Promise实现一种串行调用方式
1030浏览 • 1回复 待解决
taskpool使用 ,谁有好的方案?
722浏览 • 1回复 待解决
如何使用taskpool实现多线程
1116浏览 • 1回复 待解决
TaskPool里面是否可以使用EventHub
1766浏览 • 1回复 待解决
鸿蒙的promise要怎么写
7430浏览 • 3回复 待解决