HarmonyOS鸿蒙Next中咨询关于多线程并发的使用
HarmonyOS鸿蒙Next中咨询关于多线程并发的使用
目前我们使用rust封装了一个同步笔记的代码,通过async方式暴露给ArkTS。然后在ArkTS上,没有看到类似android上的Service之类的概念,所以想请教一下:
需求:我们笔记同步的服务希望有足够的时间运行,并且不能够block 主线程。有少数用户的笔记非常多,有可能会占用时间达到10分钟
目前使用什么方式会比较好?
使用并发的async/await方式直接调用的话,根据文档有可能不太适合,因为按文档说明是:Promise和async/await提供异步并发能力,是标准的JS异步语法。异步代码会被挂起并在之后继续执行,同一时间只有一段代码执行,适用于单次I/O任务的场景开发,例如一次网络请求、一次文件读写等操作。
那么,转而想到使用Worker,但使用worker的话,我们目前暴露的是async接口,那么按照worker的描述,是有独立子线程的,所以这个时候如果在worker里面调用async方法,会是在一个独立的环境里面,还是与其他地方调用async是一样的,都共用一个环境?
最后,请帮忙分析下我的需求,看下什么是最适合的调用方式?
更多关于HarmonyOS鸿蒙Next中咨询关于多线程并发的使用的实战教程也可以访问 https://www.itying.com/category-93-b0.html
会在一个独立的环境中运行。worker适用于以下的情况:
-
运行时间超过3分钟(不包含Promise和async/await异步调用的耗时,例如网络下载、文件读写等I/O任务的耗时)的任务。例如后台进行1小时的预测算法训练等CPU密集型任务
-
有关联的一系列同步任务。例如某数据库操作时,要用创建的句柄操作,包含增、删、改、查多个任务,要保证同一个句柄
更多关于HarmonyOS鸿蒙Next中咨询关于多线程并发的使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
worker和taskpool都会创建单独的宿主线程(子线程),线程间隔离相互不影响,长时任务(超过三分钟)推荐使用worker
有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html
rust 层用 async_worker 实现长时任务 是在独立的 FFRT 线程执行的。ArkTS 层不要用 await 去等待这个执行结果就好了。他会在合适的时机 执行完毕之后回调。
鸿蒙Next中多线程并发主要通过TaskPool和Worker实现。TaskPool适用于轻量级任务调度,支持优先级设置和任务组管理。Worker用于长时间后台任务,独立于主线程运行。使用方式:TaskPool通过dispatch()提交任务,Worker需创建实例后调用postMessage()通信。注意共享数据需使用鸿蒙提供的并发安全数据结构,如SharedArrayBuffer。线程间通信推荐使用消息机制,避免直接共享内存。鸿蒙线程模型基于Actor模式,各线程拥有独立内存空间。
针对你的需求,建议使用Worker+TaskPool的组合方案:
- Worker特性:
- 独立线程环境,与主线程完全隔离
- 适合长时间运行任务(10分钟同步完全可行)
- 每个Worker有自己的事件循环机制
- 关于async接口:
- 在Worker内调用async方法会使用该Worker自己的执行环境
- 不会与其他线程的async调用冲突
- 建议将Rust async接口封装为Worker消息处理
- 优化建议:
- 对大笔记用户使用TaskPool分发多个Worker并行处理
- 通过postMessage/progress进行进度通知
- 使用Storage做断点续传控制
- 注意事项:
- Worker初始化有约70ms开销
- 单个Worker内存限制约16MB
- 需主动管理Worker生命周期
这种方案既能保证主线程不阻塞,又能充分利用多核性能处理长时间任务。