HarmonyOS 7 启动任务并发越多越快吗:用受控队列限制资源争抢

HarmonyOS 7 启动任务并发越多越快吗:用受控队列限制资源争抢

把所有启动任务一起Promise.all,看起来减少等待,却可能让文件读取、解压和初始化争抢同一资源。对于已经解除依赖的后台任务,可以先限制同时执行数量,再测首帧是否改善。

适配范围

Promise并发不等于多线程执行。CPU密集JavaScript仍可能阻塞主线程,接入时应按任务类型使用真实后台能力。示例没有超时与取消,对可能挂起的任务要另行设置终止策略。

案例一

7个独立任务、上限2:测试记录同时活跃数,峰值必须是2,结果保持原输入顺序。

案例二

第4个任务失败:记录单项失败,其它独立任务继续。关键依赖任务失败不能沿用这一策略,必须由上层终止依赖链。

可以运行的实现

export async function bounded(jobs,limit) {
  if(!Number.isInteger(limit)||limit<1)throw Error('limit');
  const results=new Array(jobs.length);let next=0;
  async function worker(){while(true){const index=next++;if(index>=jobs.length)return;try{results[index]={ok:true,value:await jobs[index]()};}catch(error){results[index]={ok:false,error:String(error)};}}}
  await Promise.all(Array.from({length:Math.min(limit,jobs.length)},worker));return results;
}

复现与断言

把实现与以下测试放进同一个example.mjs,执行node example.mjs。断言失败会报错,全部通过正常退出。这些断言已经在本地Node.js执行;它们不代表SDK编译、真机接口调用或性能实测已经通过。

import assert from 'node:assert/strict';
let active=0,peak=0;
const jobs=Array.from({length:7},(_,i)=>async()=>{active++;peak=Math.max(peak,active);await new Promise(r=>setTimeout(r,1));active--;if(i===3)throw Error('failed');return i;});
const results=await bounded(jobs,2);assert.equal(peak,2);assert.equal(results[3].ok,false);assert.equal(results[6].value,6);assert.equal(active,0);
assert.deepEqual(await bounded([],2),[]);await assert.rejects(bounded([],0));

方案取舍

串行最保守但等待较长;全并发可能增加峰值;有限并发给资源预算一个明确旋钮。不能凭这个实验推荐固定并发2,实际值要结合I/O、CPU和首帧指标测量。

接入时别漏掉这些边界

Promise并发不等于多线程执行。CPU密集JavaScript仍可能阻塞主线程,接入时应按任务类型使用真实后台能力。示例没有超时与取消,对可能挂起的任务要另行设置终止策略。

复用时把输入获取与纯逻辑分开:界面、系统事件和服务请求负责取得真实输入,独立模块负责给出判断或保存状态。保留上述两个案例作为回归测试,并对失败原因记录最少必要日志,不记录文件内容、账号凭据或其它敏感数据。升级SDK后重新核对支持设备、接口版本与错误行为,而不是只改目标版本号。

官方资料

HarmonyOS 官方能力入口

示例验证环境为Node.js,验证范围是应用侧逻辑。本文不将示例当作系统接口接入代码;具体接口的支持设备、最低版本和调用方式,以所用SDK对应的官方文档为准。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐