N-API 提供了两种主要的异步操作处理方式:napi_create_async_worknapi_call_threadsafe_function。虽然它们都用于处理异步任务,但设计目的和使用场景有显著差异。本文将详细解析两者的区别,并提供可运行的代码示例。

核心区别概览

特性 napi_create_async_work napi_call_threadsafe_function
主要用途 处理单次异步任务 从任意线程安全调用 JS 函数
线程来源 仅限于 libuv 线程池 支持自定义线程
通信模式 单向(后台到主线程,一次完成) 双向(可多次调用)
使用场景 一次性耗时操作 持续的线程间通信

1. napi_create_async_work

napi_create_async_work 用于将耗时操作放入 libuv 的线程池执行,避免阻塞 js主线程。它遵循"执行-完成"模式,适合一次性的异步任务。

工作流程:

  1. 创建异步工作项
  2. 定义在后台线程执行的函数(execute 回调)
  3. 定义操作完成后在主线程执行的回调(complete 回调)
  4. 将工作项加入队列等待执行

2. napi_call_threadsafe_function

napi_call_threadsafe_function 用于从任意线程安全地调用 JavaScript 函数。它允许自定义线程与主线程之间进行安全通信,特别适合需要多次从后台线程发送数据到主线程的场景。

工作流程:

  1. 创建线程安全的函数包装器
  2. 启动自定义后台线程
  3. 从后台线程中调用线程安全函数
  4. N-API 负责将调用转发到主线程
  5. 完成后清理资源

如何选择?

  • 当你需要执行一个单次的耗时操作,并且在操作完成后需要通知主线程时,选择 napi_create_async_work
  • 当你需要创建一个长时间运行的自定义线程,并且需要频繁地与主线程通信(如进度更新、事件通知)时,选择 napi_call_threadsafe_function

这两个 API 也可以结合使用:用 napi_create_async_work 处理主要的异步任务,在任务执行过程中,用 napi_call_threadsafe_function 发送进度更新。

通过合理选择和使用这两个 API,可以有效地构建高性能且响应迅速的 napi原生模块。

历史系列教程

如果刚接触鸿蒙NDK开发,建议按顺序学习以下文章,从环境搭建到接口开发全覆盖:

  1. 【鸿蒙/OpenHarmony/NDK】C/C++开发教程之环境搭建
  2. 【鸿蒙/OpenHarmony/NDK】什么是NDK?为啥要用NDK?
  3. 【鸿蒙/OpenHarmony/NDK】如何在鸿蒙应用中使用NDK?
  4. 【鸿蒙/OpenHarmony/NDK】如何在鸿蒙Native C++样例代码中新增一个JS接口?
  5. 【鸿蒙/OpenHarmony/NDK】应用太卡?用 Node-API 异步任务解决:从卡顿根源到流畅方案
  6. 【鸿蒙/OpenHarmony/NDK】多线程调用 JS 总崩溃?用 napi_create_threadsafe_function 搞定线程安全交互
Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐