【HarmonyOS NEXT】FAQ之ArkTS语言(线程模型和并发-2)

1、如果在ArkTS中大部分后台任务(计算、埋点、入库)都使用异步并发的方式,是否会使主线程越来越慢,引起卡顿丢帧问题?为什么

ArkTS层接口的异步如果不涉及I/O操作,则异步任务会在主线程的微任务执行时机触发,仍然占用主线程。推荐使用TaskPool,分发到后台任务池进行。

2、在ArkTS的主线程中使用await会堵塞主线程吗

不会。await会挂起当前异步任务,等异步任务满足条件后再唤醒执行,主线程可以处理其他任务。

3、是否可以在TaskPool中动态加载模块(HAR、HSP、SO)

可以,TaskPool动态加载能力跟主线程能力一致。但是TaskPool线程加载后,由于模块化线程隔离的缘故,不能给主线程复用。

4、ArkTS有哪些线程安全的数据类型,多线程方案如何保证线程安全

ArkTS的多线程是基于事件共享实现的,其数据交换是基于事件进行传递对象,不会出现类似Java的内存共享型多线程出现的多线程操作同一个数据的情况,所以不存在线程安全的问题。

ArkTS语言基础类库提供的taskPool和worker两个多线程的方案,都是基于Actor并发模型实现的。Actor并发模型是基于事件基础传递数据,不需要开发者去面对锁带来的一系列复杂偶发的问题,是线程安全的,同时并发度也相对较高。目前线程间的数据传输支持的对象分为三类,普通的JavaScript对象,可转移对象,可共享对象。

5、TaskPool线程内存如何共享

TaskPool底层模型为Actor模型,本身线程间隔离,内存不共享。目前可以通过传输可共享对象SharedArrayBuffer达到内存共享的目的。

但需要注意,SharedArrayBuffer对象存储的数据在同时被修改时,需要通过原子操作保证其同步性,即下个操作开始之前务必需要等到上个操作已经结束。

6、TaskPool后台I/O任务池,应用能否自行做管控?有无方法开放管理机制
  • TaskPool后台线程是根据负载及硬件决定的,无法开放管理,只能支持串行队列,任务组等机制进行任务管控。

  • I/O任务池有底层进行调度,无法自行管控。

7、如何解决应用需要避免开辟过多线程,并发处理任务数量受限,无法充分发挥设备性能的问题

当前ArkTS创建线程(worker)会创建一个新的ArkTS引擎实例,会占用额外的内存。同时,ArkTS提供了TaskPool并发API,类似GCD的线程池能力,可以执行任务,而且不需要开发者进行线程生命周期管理。Task会被调度到有限数量的工作线程执行,多个task会共享这些工作线程(ArkTS引擎实例),系统会根据负载情况扩容/缩容工作线程的数量,充分发挥硬性性能。

因此针对需要大量线程的问题,应用的开发建议如下:

将多线程任务转变为并发任务,通过TaskPool分发执行;I/O型任务不需要单独开启线程,而是在当前线程(可以是TaskPool线程)执行;少量需要常驻的CPU密集型任务,采用Worker,并且需要控制在64个及以下。

8、Worker线程内存如何共享

Worker底层模型为Actor模型,本身线程间隔离,内存不共享。目前可以通过传输可共享对象SharedArrayBuffer达到内存共享的目的。

但需要注意,SharedArrayBuffer对象存储的数据在同时被修改时,需要通过原子操作保证其同步性,即下个操作开始之前务必需要等到上个操作已经结束。

9、如何判断是否为主线程

通过Process可以获取当前的进程号和线程号,如果当前代码执行的进程号和线程号相同,则表示当前执行环境为主线程。

10、ArkTS实现多Worker实例

实现多Worker并进行调用传递消息,利用registerGlobalCallObject传递对象及调用函数,获取buffer,注:callGlobalCallObjectMethod方法在主线程中运行的。

11、如何在TaskPool和Woker获取上下文Context

Worker线程和TaskPool线程中无法直接获取到组件级的Context 。可以通过主线程参数传递应用级Context,通过getContext接口获取Context上下文。

更多详情查看:文档中心

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值