鸿蒙Harmony开发实战:线程异步JS 机制总结

背景介绍

回调函数是 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 接口

相关推荐
程序员与背包客_CoderZ7 分钟前
C++设计模式——Abstract Factory Pattern抽象工厂模式
c语言·开发语言·c++·设计模式·抽象工厂模式
Mike_188702783518 分钟前
深入探索Golang的GMP调度机制:源码解析与实现原理
开发语言·后端·golang
Dragon Wu9 分钟前
前端框架 Redux tool RTK 总结
前端·javascript·前端框架
SoraLuna12 分钟前
「Mac玩转仓颉内测版32」基础篇12 - Cangjie中的变量操作与类型管理
开发语言·算法·macos·cangjie
yqcoder18 分钟前
reactflow 中 useStoreApi 模块作用
前端·javascript
williamdsy22 分钟前
【vue】关于异步函数使用不当导致的template内容完全无法渲染的问题
前端·javascript·vue.js
2402_8397080522 分钟前
第十章:作业
开发语言·前端·javascript
诗水人间25 分钟前
前后端分离,解决vue+axios跨域和proxyTable不生效等问题
前端·javascript·vue.js·springboot·springsecurity·跨域·cros
东方巴黎~Sunsiny25 分钟前
给定数字 [3, 30, 34, 5, 9] 拼接成的最大数字,使用java实现
java·开发语言
恩爸编程25 分钟前
纯前端js完成游戏吃豆人
前端·javascript·游戏·游戏程序·开源软件·游戏策划·游戏机