背景介绍
回调函数是 JavaScript 中常见的一种编程模式,它在异步编程中起到了重要作用。在 NAPI (Node.js API)中,回调函数也被广泛应用,用于处理各种异步操作,例如文件读写、网络请求等。按照触发源或目的线程分为 JS 线程、C++ 线程,按照回调方式分为同步回调、异步回调,本文重点介绍 C++ 线程异步回调 JS 的机制。
C++ 异步回调 JS 机制
机制一 Async Work
首先需要进行数据定义,如下所示
接着调用 napi_create_async_work 接口
机制二 Threadsafe Function
JS 函数只能被 JS 主线程调用。如果 native 创建的其他线程需要调用 JS 函数,则需要拿到 JS 主线程的 napi_env 来调用 N-API 函数。
若 native 创建的其他线程必须与 JS 主线程进行通信,线程安全函数 API 提供了 native 创建的其他线程调用 JS 函数的方法。
使用样例
回调函数定义,如下所示
应用调用
使用步骤
线程安全函数的使用步骤是,先 napi_create_threadsafe_function 创建函数引用, napi_call threadsafe_function 通过这个函数引用调用线程安全函数。
机制说明
napi create threadsafe_function 是通过创建 uv _async 实例 &async 并绑定 AsyncCb, 再在其他线程中调用 napi_call_threadsafe_function(tsfn) 后 (tsfn 数据结构包含&async),使用 uv_async_send(&async) 唤醒持有 async 的 JS 主线程消息队列,并调用 async 的回调 AsyncCb->call js_cb()。
注意事项
1.napi_release_threadsafe_function 最后一个参数为 napi_tsfn_abort 时,会立即关闭线程安全函数,导致 JS 主线程无法回调函数;
2.如果创建的线程安全函数的最大队列大小为 0,则 Napi_call_threadsafe_function()永远不会阻塞。
3.napi_call_threadsafe_function()不应该在 JS 线程的 napi_tsfn_blocking 中调用,因为如果队列满了,它可能会导致 JavaScript 线程死锁。
机制三 uv_queue_work
首先需要进行数据定义,如下所示
接着调用 uv_queue_work 接口
总结
相同点
机制一 async_Work 、机制二 Threadsafe Function(简称 tsfn)、机制三 uv_queue_work
使用场景逻辑一致,都是在其他线程主函数运行时,回到 JS 主线程,并将回调函数, push 到 JS 主线程的 event-loop 队列里等待被执行。
不同点
1.创建的线程不一样: 机制一 Napi Async Work 在 queue async work 时会自己创建线程,这个线程属于 Libuv 线程池,和 JS 主线程一样具有 event-loop 和 napi_env。机制二 tsfn、机制三 uv_queue_work 其他线程处理时开发自己创建新线程,一般根据业务需要创建的,不在 Libuv 线程池中,也没有 JS 主线程的特性。
2.JS 主线程的回调函数被执行得到时机、效率不一致:机制一 async_Work 、机制三 uv_queue_work 必须等到新创建的线程主函数被执行完后,被动被执行,只能被调用一次;机制二 tsfn 的回调函数在其他线程中,可以在任意时机主动调用任意次数,而且不用依赖其他函数。Napi_Async_Work 的使用场景是 Napi_Threadsafe_Function 使用场景的子集,但是 Napi_Async_Work 无需开发者创建线程,并且线程具有 event-loop 和 napi_env 特性。
最后
有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。
点击领取→【纯血版鸿蒙全套最新学习资料】(安全链接,放心点击)希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!
这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、(南向驱动、嵌入式等)鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。
鸿蒙(HarmonyOS NEXT)最新学习路线
有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。
获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料
HarmonyOS Next 最新全套视频教程
《鸿蒙 (OpenHarmony)开发基础到实战手册》
OpenHarmony北向、南向开发环境搭建
《鸿蒙开发基础》
- ArkTS语言
- 安装DevEco Studio
- 运用你的第一个ArkTS应用
- ArkUI声明式UI开发
- .……
《鸿蒙开发进阶》
- Stage模型入门
- 网络管理
- 数据管理
- 电话服务
- 分布式应用开发
- 通知与窗口管理
- 多媒体技术
- 安全技能
- 任务管理
- WebGL
- 国际化开发
- 应用测试
- DFX面向未来设计
- 鸿蒙系统移植和裁剪定制
- ……
《鸿蒙进阶实战》
- ArkTS实践
- UIAbility应用
- 网络案例
- ……
大厂面试必问面试题
鸿蒙南向开发技术
鸿蒙APP开发必备
鸿蒙生态应用开发白皮书V2.0PDF
总结
总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。