OpenHarmony ETS Utils 模块 1. 模块概述 源码:https://gitee.com/openharmony/commonlibrary_ets_utils
1.1 功能与目标 1.1.1 主要功能 OpenHarmony ETS Utils 是一个综合性的工具库,为OpenHarmony系统提供核心的JavaScript/TypeScript运行时工具支持。该模块包含以下四个主要子模块:
子模块 功能描述 js_api_module 提供URL解析、URI处理、XML解析/序列化、Buffer数据处理等API功能 js_util_module 提供通用工具类,包括容器数据结构、JSON处理、流处理等 js_sys_module 提供系统级功能,包括进程管理、控制台输出、定时器等 js_concurrent_module 提供并发编程支持,包括TaskPool任务池、Worker线程、异步锁等
1.1.2 设计目标 高性能 : 采用C++实现核心功能,通过N-API与JavaScript层交互跨平台 : 支持OHOS、Windows、Mac、iOS、Android等多平台线程安全 : 提供完善的并发控制机制易用性 : 提供简洁的JavaScript API接口1.1.3 使用场景 URL/URI解析与处理 XML文档的解析与生成 二进制数据的Buffer操作 多线程任务调度与执行 进程信息获取与管理 定时器功能实现 异步锁与并发控制 1.2 系统位置 1.2.1 在系统中的位置 ETS Utils模块位于OpenHarmony的commonlibrary 子系统中,是系统的核心基础模块 ,为上层应用和框架提供基础工具支持。
1.2.2 与其他模块的关系 - 系统框图 ┌─────────────────────────────────────────────────────────────────┐ │ 应用层 (Application Layer) │ ├─────────────────────────────────────────────────────────────────┤ │ 框架层 (Framework Layer) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ ACE Engine │ │ ArkUI │ │ 其他框架 │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ ├─────────┼────────────────┼────────────────┼─────────────────────┤ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ ETS Utils 模块 │ │ │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────┐ │ │ │ │ │js_api_mod │ │js_util_mod │ │js_sys_mod │ │js_conc │ │ │ │ │ │ ·URL │ │ ·容器 │ │ ·Process │ │·TaskPool│ │ │ │ │ │ ·URI │ │ ·JSON │ │ ·Console │ │·Worker │ │ │ │ │ │ ·XML │ │ ·Stream │ │ ·Timer │ │·Locks │ │ │ │ │ │ ·Buffer │ │ │ │ │ │ │ │ │ │ │ └────────────┘ └────────────┘ └────────────┘ └────────┘ │ │ │ └──────────────────────────────────────────────────────────┘ │ ├─────────────────────────────────────────────────────────────────┤ │ 系统服务层 (System Services) │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ NAPI │ │ libuv │ │ FFRT │ │ HiLog │ │ HiSysEv │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ └─────────────────────────────────────────────────────────────────┘1.2.3 依赖组件 依赖组件 用途 napi N-API接口,实现JS与C++交互 libuv 异步I/O和事件循环 ffrt 函数流运行时,任务调度 hilog 日志系统 hisysevent 系统事件上报 icu 国际化支持 openssl 加密支持 libxml2 XML解析库
1.3 设计思路与模式 1.3.1 设计思路 分层架构设计
JavaScript层 : 提供用户友好的API接口N-API绑定层 : 实现JS与C++的桥接C++核心层 : 实现核心业务逻辑平台适配层 : 处理跨平台差异模块化设计
各子模块功能独立,低耦合 统一的错误处理机制 共享公共工具类 异步优先设计
大量使用异步操作避免阻塞 基于libuv实现事件驱动 支持Promise和回调两种异步模式 1.3.2 设计模式 设计模式 应用场景 示例 单例模式 全局唯一管理器 TaskManager::GetInstance()工厂模式 对象创建 Task::GenerateTask()观察者模式 事件监听 Worker的事件监听机制 策略模式 任务调度策略 任务优先级调度 状态模式 状态管理 Task的ExecuteState状态机 命令模式 任务封装 TaskInfo封装任务信息
2. 模块结构 2.1 源文件与头文件 2.1.1 js_concurrent_module (并发模块) TaskPool 子模块 文件 功能描述 task.h/cpp任务类定义,封装可执行任务 taskpool.h/cpp任务池主入口,提供Execute/Cancel等API task_manager.h/cpp任务管理器,单例模式,管理所有任务和工作线程 task_queue.h/cpp任务队列,按优先级管理待执行任务 task_group.h/cpp任务组,支持批量任务执行 sequence_runner.h/cpp序列运行器,保证任务顺序执行 async_runner.h/cpp异步运行器,支持异步任务执行 worker.h/cpp工作线程,执行具体任务 thread.h/cpp线程基类,封装uv_thread
Worker 子模块 文件 功能描述 worker.h/cppWorker线程实现,支持消息传递 worker_runner.h/cppWorker运行器 message_queue.h/cpp消息队列,线程间通信
Utils 子模块 文件 功能描述 utils.h/cpp工具类入口 locks/async_lock.h/cpp异步锁实现 locks/async_lock_manager.h/cpp异步锁管理器 locks/lock_request.h/cpp锁请求封装 condition/*.h/cpp条件变量实现
2.1.2 js_api_module (API模块) 子目录 主要文件 功能描述 url/js_url.h/cppURL解析与操作 uri/js_uri.h/cppURI解析与操作 xml/js_xml.h/cppXML序列化与解析 buffer/js_buffer.h/cppBuffer数据操作 convertxml/js_convertxml.h/cppXML转换工具
2.1.3 js_sys_module (系统模块) 子目录 主要文件 功能描述 process/js_process.h/cpp进程信息获取与管理 console/console.h/cpp控制台输出 timer/sys_timer.h/cpp定时器实现 dfx/native_module_dfx.cppDFX诊断功能
2.1.4 js_util_module (工具模块) 子目录 主要文件 功能描述 container/各容器实现文件 ArrayList, HashMap, TreeMap等容器 json/native_module_json.cppJSON处理 stream/native_module_stream.cpp流处理 util/js_util.h/cpp通用工具函数
2.2 类、结构体、函数与方法 2.2.1 核心类设计 Task 类 (任务类) class Task { public : // 构造函数 Task ( ) = default ; Task ( napi_env env, TaskType taskType, const char * name) ; ~ Task ( ) = default ; // 静态工厂方法 static Task* GenerateTask ( napi_env env, napi_value task, napi_value func, napi_value name, napi_value* args, size_t argc) ; static Task* GenerateFunctionTask ( napi_env env, napi_value func, napi_value* args, size_t argc, TaskType type) ; static TaskInfo* GenerateTaskInfo ( napi_env env, napi_value func, napi_value args, napi_value transferList, napi_value cloneList, Priority priority, bool defaultTransfer= true , bool defaultCloneSendable= false ) ; // N-API 回调方法 static napi_valueTaskConstructor ( napi_env env, napi_callback_info cbinfo) ; static napi_valueSetTransferList ( napi_env env, napi_callback_info cbinfo) ; static napi_valueIsCanceled ( napi_env env, napi_callback_info cbinfo) ; static napi_valueSendData ( napi_env env, napi_callback_info cbinfo) ; static napi_valueAddDependency ( napi_env env, napi_callback_info cbinfo) ; static napi_valueRemoveDependency ( napi_env env, napi_callback_info cbinfo) ; // 状态管理方法 bool UpdateTaskStateToWaiting ( ) ; bool UpdateTaskStateToRunning ( ) ; bool UpdateTaskStateToCanceled ( ) ; bool UpdateTaskStateToFinished ( ) ; // 任务属性 bool IsRepeatableTask ( ) const ; bool IsGroupTask ( ) const ; bool IsLongTask ( ) const ; bool IsPeriodicTask ( ) const ; public : // 成员变量 napi_env env_= nullptr ; std:: atomic< TaskType> taskType_{ TaskType:: TASK} ; std:: string name_{ } ; uint32_t taskId_{ } ; std:: atomic< ExecuteState> taskState_{ ExecuteState:: NOT_FOUND} ; uint64_t groupId_{ } ; uint64_t seqRunnerId_{ } ; TaskInfo* currentTaskInfo_{ } ; std:: list< TaskInfo* > pendingTaskInfos_{ } ; void * result_= nullptr ; std:: atomic< bool > success_{ true } ; void * worker_{ nullptr } ; // ... 更多成员 } ; TaskManager 类 (任务管理器 - 单例) class TaskManager { public : // 单例获取 static TaskManager& GetInstance ( ) ; // 任务管理 void StoreTask ( Task* task) ; bool RemoveTask ( uint32_t taskId) ; Task* GetTask ( uint32_t taskId) ; void EnqueueTaskId ( uint32_t taskId, Priority priority= Priority:: DEFAULT) ; std:: pair< uint32_t , Priority> DequeueTaskId ( ) ; void CancelTask ( napi_env env, uint32_t taskId) ; // Worker管理 void NotifyWorkerIdle ( Worker* worker) ; void NotifyWorkerCreated ( Worker* worker) ; void NotifyWorkerRunning ( Worker* worker) ; void RemoveWorker ( Worker* worker) ; // 负载均衡 void InitTaskManager ( napi_env env) ; void UpdateExecutedInfo ( uint64_t duration) ; void TryTriggerExpand ( ) ; // 状态查询 uint32_t GetTaskNum ( ) ; uint32_t GetIdleWorkers ( ) ; uint32_t GetThreadNum ( ) ; private : TaskManager ( ) ; ~ TaskManager ( ) ; // 私有成员 std:: unordered_map< uint32_t , Task* > tasks_{ } ; std:: unordered_set< Worker* > workers_{ } ; std:: unordered_set< Worker* > idleWorkers_{ } ; std:: array< std:: unique_ptr< ExecuteQueue> , Priority:: NUMBER> taskQueues_{ } ; // ... 更多成员 } ; Worker 类 (工作线程) class Worker { public : // 状态枚举 enum RunnerState { STARTING, RUNNING, TERMINATEING, TERMINATED} ; enum HostState { ACTIVE, INACTIVE} ; enum ListenerMode { ONCE, PERMANENT} ; enum ScriptMode { CLASSIC, MODULE} ; // 构造与析构 Worker ( napi_env env, napi_ref thisVar) ; ~ Worker ( ) ; // 静态方法 - N-API回调 static napi_valuePostMessage ( napi_env env, napi_callback_info cbinfo) ; static napi_valueTerminate ( napi_env env, napi_callback_info cbinfo) ; static napi_valueOn ( napi_env env, napi_callback_info cbinfo) ; static napi_valueOff ( napi_env env, napi_callback_info cbinfo) ; static napi_valueConstructor ( napi_env env, napi_callback_info cbinfo, bool limitSign= false , WorkerVersion version= WorkerVersion:: NONE) ; // 消息处理 static void HostOnMessage ( const uv_async_t* req) ; static void WorkerOnMessage ( const uv_async_t* req) ; static void ExecuteInThread ( const void * data) ; // 状态管理 bool UpdateWorkerState ( RunnerState state) ; bool IsRunning ( ) const ; bool IsTerminated ( ) const ; private : // 私有成员 std:: string script_{ } ; std:: string name_{ } ; MessageQueue workerMessageQueue_{ } ; MessageQueue hostMessageQueue_{ } ; std:: atomic< RunnerState> runnerState_{ STARTING} ; napi_env hostEnv_{ nullptr } ; napi_env workerEnv_{ nullptr } ; // ... 更多成员 } ; URL 类 class URL { public : // 构造函数 explicit URL ( const std:: string& input) ; URL ( const std:: string& input, const std:: string& base) ; URL ( const std:: string& input, const URL& base) ; ~ URL ( ) { } // Getter方法 napi_valueGetHostname ( napi_env env) const ; napi_valueGetSearch ( napi_env env) const ; napi_valueGetUsername ( napi_env env) const ; napi_valueGetPassword ( napi_env env) const ; napi_valueGetFragment ( napi_env env) const ; napi_valueGetScheme ( napi_env env) const ; napi_valueGetPath ( napi_env env) const ; napi_valueGetPort ( napi_env env) const ; napi_valueGetHost ( napi_env env) const ; // Setter方法 void SetHostname ( const std:: string& input) ; void SetUsername ( const std:: string& input) ; void SetPassword ( const std:: string& input) ; void SetScheme ( const std:: string& input) ; void SetFragment ( const std:: string& input) ; void SetSearch ( const std:: string& input) ; void SetHost ( const std:: string& input) ; void SetPort ( const std:: string& input) ; void SetHref ( const std:: string& input) ; void SetPath ( const std:: string& input) ; private : UrlData urlData_; std:: bitset< 11 > flags_; } ; Buffer 类 class Buffer { public : Buffer ( ) = default ; virtual ~ Buffer ( ) ; // 初始化方法 void Init ( uint32_t size) ; void Init ( Buffer* buffer) ; void Init ( Buffer* pool, unsigned int poolOffset, unsigned int length) ; void Init ( uint8_t * buffer, unsigned int byteOffset, unsigned int length) ; // 属性访问 unsigned int GetLength ( ) ; void SetLength ( unsigned int len) ; unsigned int GetByteOffset ( ) ; int32_t Get ( uint32_t index) ; void Set ( uint32_t index, uint8_t value) ; // 读写方法 void WriteInt32BE ( int32_t value, uint32_t offset) ; void WriteInt32LE ( int32_t value, uint32_t offset) ; int32_t ReadInt32BE ( uint32_t offset) ; int32_t ReadInt32LE ( uint32_t offset) ; // 字符串操作 unsigned int WriteString ( std:: string value, unsigned int size) ; unsigned int WriteString ( std:: string value, unsigned int offset, unsigned int length, std:: string encoding) ; // Buffer操作 void SubBuffer ( Buffer* tBuf, uint32_t start, uint32_t end) ; uint32_t Copy ( Buffer* tBuf, uint32_t tStart, uint32_t sStart, uint32_t sEnd) ; int Compare ( Buffer* tBuf, uint32_t targetStart, uint32_t sourceStart, uint32_t length) ; private : uint8_t * raw_{ nullptr } ; unsigned int byteOffset_{ } ; unsigned int length_{ } ; bool needRelease_{ true } ; } ; 2.2.2 关键结构体 // 任务执行状态 enum ExecuteState { NOT_FOUND, // 未找到 WAITING, // 等待中 RUNNING, // 执行中 CANCELED, // 已取消 FINISHED, // 已完成 DELAYED, // 延迟中 ENDING// 结束中 } ; // 任务类型 enum TaskType { TASK, // 普通任务 FUNCTION_TASK, // 函数任务 SEQRUNNER_TASK, // 序列运行器任务 COMMON_TASK, // 通用任务 GROUP_COMMON_TASK, // 组通用任务 GROUP_FUNCTION_TASK, // 组函数任务 ASYNCRUNNER_TASK// 异步运行器任务 } ; // 任务优先级 enum Priority { HIGH= 0 , // 高优先级 MEDIUM= 1 , // 中优先级 LOW= 2 , // 低优先级 IDLE= 3 , // 空闲优先级 DEFAULT= MEDIUM, NUMBER= 4 } ; // 任务信息结构体 struct TaskInfo { napi_deferred deferred= nullptr ; Priority priority= Priority:: DEFAULT; void * serializationFunction= nullptr ; void * serializationArguments= nullptr ; } ; // 任务组信息 struct GroupInfo { uint32_t finishedTaskNum{ } ; napi_ref resArr{ nullptr } ; Priority priority{ Priority:: DEFAULT} ; napi_deferred deferred{ nullptr } ; int32_t failedIndex{ - 1 } ; } ; // 定时器回调信息 struct TimerCallbackInfo { napi_env env_{ nullptr } ; uint32_t tId_{ } ; int32_t timeout_{ } ; napi_ref callback_{ } ; bool repeat_{ } ; uv_timer_t* timeReq_{ nullptr } ; size_t argc_{ } ; napi_ref* argv_{ nullptr } ; } ; 2.2.3 继承关系图 继承
包含
包含
包含
包含
«abstract»
Thread
+uv_thread_t tid_
+Start() : bool
+Run() : void
+GetThreadId() : uv_thread_t
TaskPoolWorker
+napi_env env_
+Run() : void
+NotifyIdle() : void
XmlPullParser
+strXml_ string
+position_ size_t
+Parse() : void
+GetDepth() : int
+GetName() : string
ParseInfo
+GetDepth() : napi_value
+GetColumnNumber() : napi_value
+GetLineNumber() : napi_value
+GetName() : napi_value
Worker
+hostEnv_ napi_env
+workerEnv_ napi_env
+runnerState_ RunnerState
+PostMessage() : napi_value
+Terminate() : napi_value
WorkerListener
+env_ napi_env
+callback_ napi_ref
+mode_ ListenerMode
WorkerParams
+name_ string
+type_ ScriptMode
+workerPriority_ WorkerPriority
WorkerWrapper
+workerPtr_ Worker
+GetWorker()
2.3 类图 2.3.1 TaskPool 模块类图 使用
创建
管理
管理
包含
包含
关联
关联
执行
«static»
TaskPool
+Execute(env, cbinfo) : napi_value
+ExecuteDelayed(env, cbinfo) : napi_value
+Cancel(env, cbinfo) : napi_value
+GetTaskPoolInfo(env, cbinfo) : napi_value
-HandleTaskResult(task) : void
-ExecuteTask(env, task, priority) : void
«singleton»
TaskManager
-tasks_ unordered_map
-workers_ unordered_set
-idleWorkers_ unordered_set
-taskQueues_ array
+GetInstance()
+StoreTask(task) : void
+GetTask(taskId)
+EnqueueTaskId(taskId, priority) : void
+DequeueTaskId() : pair
+NotifyWorkerIdle(worker) : void
+NotifyWorkerCreated(worker) : void
Task
+env_ napi_env
+taskType_ TaskType
+name_ string
+taskId_ uint32_t
+taskState_ ExecuteState
+groupId_ uint64_t
+currentTaskInfo_ TaskInfo
+GenerateTask()
+GenerateFunctionTask()
+IsCanceled() : napi_value
+SendData() : napi_value
+UpdateTaskStateToWaiting() : bool
+UpdateTaskStateToRunning() : bool
TaskInfo
+deferred napi_deferred
+priority Priority
+serializationFunction void
+serializationArguments void
Worker
-tid_ uv_thread_t
-env_ napi_env
+Run() : void
+NotifyIdle() : void
TaskGroup
+env_ napi_env
+groupId_ uint64_t
+taskIds_ list
+taskNum_ uint32_t
+groupState_ ExecuteState
+AddTask() : napi_value
+CancelGroupTask(env, taskId) : void
SequenceRunner
+seqRunnerId_ uint64_t
+priority_ Priority
+seqRunnerTasks_ deque
+Execute() : napi_value
+AddTask(task) : void
+TriggerTask(env) : void
ExecuteQueue
-tasks_ list
+EnqueueTaskId(taskId) : void
+DequeueTaskId() : uint32_t
+IsEmpty() : bool
+GetTaskNum() : uint32_t
2.3.2 Worker 模块类图 使用
使用
包含
使用
Worker
-hostEnv_ napi_env
-workerEnv_ napi_env
-runnerState_ RunnerState
-hostState_ HostState
-workerMessageQueue_ MessageQueue
-hostMessageQueue_ MessageQueue
-script_ string
-name_ string
+PostMessage() : napi_value
+Terminate() : napi_value
+On() : napi_value
+Off() : napi_value
+Constructor() : napi_value
+HostOnMessage() : void
+WorkerOnMessage() : void
+ExecuteInThread() : void
+UpdateWorkerState(state) : bool
+IsRunning() : bool
+IsTerminated() : bool
MessageQueue
-queue_ list
-mutex_ mutex
+Push(data) : void
+Pop() : MessageData
+Clear(env) : void
+IsEmpty() : bool
WorkerRunner
-worker_ Worker
+Run() : void
WorkerListener
+env_ napi_env
+callback_ napi_ref
+mode_ ListenerMode
+NextIsAvailable() : bool
+SetMode(mode) : void
WorkerParams
+name_ string
+type_ ScriptMode
+workerPriority_ WorkerPriority
2.3.3 API 模块类图 关联
URL
-urlData_ UrlData
-flags_ bitset
+GetHostname(env) : napi_value
+SetHostname(input) : void
+GetSearch(env) : napi_value
+SetSearch(input) : void
+GetUsername(env) : napi_value
+SetUsername(input) : void
+GetPath(env) : napi_value
+SetPath(input) : void
+GetPort(env) : napi_value
+SetPort(input) : void
URLSearchParams
-searchParams vector
+IsHas(env, name) : napi_value
+Get(env, buffer) : napi_value
+GetAll(env, buffer) : napi_value
+Append(env, buffer, temp) : void
+Delete(env, buffer) : void
+Set(env, name, value) : void
+Sort() : void
Buffer
-raw_ uint8_t
-length_ uint
-byteOffset_ uint
-needRelease_ bool
+Init(size) : void
+Get(index) : int32_t
+Set(index, value) : void
+WriteInt32BE(value, offset) : void
+ReadInt32BE(offset) : int32_t
+Copy(tBuf, tStart, sStart, sEnd) : uint32_t
+Compare(tBuf, targetStart, sourceStart, length) : int
XmlSerializer
-pStart_ char
-iLength_ size_t
-encoding_ string
+SetAttributes(name, value) : void
+AddEmptyElement(name) : void
+StartElement(name) : void
+EndElement() : void
+SetComment(comment) : void
+SetCData(data) : void
XmlPullParser
-strXml_ string
-position_ size_t
-depth size_t
+GetDepth() : int
+GetName() : string
+GetText() : string
+Parse(env, thisVar, deprecated) : void
+ParseTagType(inDeclaration) : TagEnum
2.4 模块内部依赖框图 ┌─────────────────────────────────────────────────────────────────────────────────┐ │ 模块内部依赖关系图 │ ├─────────────────────────────────────────────────────────────────────────────────┤ │ │ │ js_concurrent_module │ │ ┌─────────────────────────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ taskpool/ │─────►│ common/ │◄─────│ worker/ │ │ │ │ │ │ │ │ helper/ │ │ │ │ │ │ │ └──────┬──────┘ └─────────────┘ └──────┬──────┘ │ │ │ │ │ ▲ │ │ │ │ │ │ │ │ │ │ │ │ ▼ │ ▼ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ utils/ │─────►│ tools/ │◄─────│ platform/ │ │ │ │ │ │ locks/ │ │ log.h │ │ │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────────────────────┘ │ │ │ │ js_api_module │ │ ┌─────────────────────────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ url/ │ │ uri/ │ │ xml/ │ │ │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ │ │ │ │ └────────────────────┼────────────────────┘ │ │ │ │ ▼ │ │ │ │ ┌─────────────┐ │ │ │ │ ┌─────────────┐ │ buffer/ │ ┌─────────────┐ │ │ │ │ │ convertxml/ │─────►│ converter │◄─────│ fastbuffer/ │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────────────────────┘ │ │ │ │ js_sys_module │ │ ┌─────────────────────────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ process/ │ │ console/ │ │ timer/ │ │ │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ │ │ │ │ └────────────────────┼────────────────────┘ │ │ │ │ ▼ │ │ │ │ ┌─────────────┐ │ │ │ │ │ dfx/ │ │ │ │ │ └─────────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────────┘3. 模块间交互 3.1 交互描述 3.1.1 与NAPI的交互 所有模块都通过N-API与JavaScript层进行交互:
使用napi_value进行值传递 使用napi_callback_info获取回调参数 使用napi_env管理JavaScript执行环境 使用napi_ref管理JavaScript对象引用 3.1.2 与libuv的交互 并发模块大量使用libuv进行异步操作:
uv_async_t: 异步信号通知uv_timer_t: 定时器uv_thread_t: 线程管理uv_loop_t: 事件循环3.1.3 异步处理机制流程图 主线程回调
C++层 - Worker线程
N-API层
JavaScript层
napi_resolve_deferred
TaskPool::HandleTaskResult
执行任务函数
Worker::Run
uv_async_send 通知主线程
创建 napi_deferred
TaskPool::Execute
TaskManager::EnqueueTaskId
await result
taskpool.execute
3.1.4 多线程处理方式 机制 用途 实现方式 TaskPool 任务并行执行 线程池 + 任务队列 Worker 独立线程执行 独立线程 + 消息传递 AsyncLock 异步锁 Promise + 等待队列 SequenceRunner 顺序执行 任务队列 + 依赖管理
3.1.5 事件驱动机制 Worker模块采用事件驱动机制:
// 事件类型 - "message" // 消息事件 - "error" // 错误事件 - "messageerror" // 消息错误事件 - "exit" // 退出事件 // 监听方式 worker. on ( "message" , callback) ; // 持久监听 worker. once ( "message" , callback) ; // 单次监听 worker. off ( "message" ) ; // 取消监听 3.2 外部依赖框图 系统依赖
功能依赖
诊断依赖
核心依赖
c_utils C++工具
IPC 进程间通信
SAMGR 服务管理
EventHandler 事件处理
ICU 国际化
OpenSSL 加密
libxml2 XML解析
HiLog 日志
HiSysEvent 事件上报
HiTrace 跟踪
NAPI JS绑定
libuv 异步I/O
FFRT 任务调度
ETS Utils 模块
4. 状态机转换图 4.1 Task 状态机模型 4.1.1 状态定义 状态 值 描述 NOT_FOUND 0 任务未找到/初始状态 WAITING 1 等待执行 RUNNING 2 正在执行 CANCELED 3 已取消 FINISHED 4 已完成 DELAYED 5 延迟执行中 ENDING 6 结束中
4.1.2 状态机树图 execute
executeDelayed
cancel
dequeue
cancel
timeout
cancel
success
cancel
ending
cleanup
NOT_FOUND 初始状态
WAITING 等待中
DELAYED 延迟中
RUNNING 执行中
CANCELED 已取消
FINISHED 已完成
ENDING 结束中
4.1.3 状态切换规则 当前状态 目标状态 触发条件 触发方法 NOT_FOUND WAITING 任务入队 UpdateTaskStateToWaiting()NOT_FOUND DELAYED 延迟任务入队 UpdateTaskStateToDelayed()NOT_FOUND CANCELED 任务取消 UpdateTaskStateToCanceled()WAITING RUNNING 工作线程获取任务 UpdateTaskStateToRunning()WAITING CANCELED 用户取消任务 UpdateTaskStateToCanceled()DELAYED WAITING 延迟时间到达 UpdateTaskStateToWaiting()DELAYED CANCELED 用户取消任务 UpdateTaskStateToCanceled()RUNNING FINISHED 任务执行完成 UpdateTaskStateToFinished()RUNNING CANCELED 任务执行中取消 UpdateTaskStateToCanceled()RUNNING ENDING 任务开始结束 UpdateTaskStateToEnding()ENDING FINISHED 结束处理完成 UpdateTaskStateToFinished()
4.2 Worker 状态机模型 4.2.1 RunnerState 状态机 创建Worker
线程启动完成
调用terminate()
重新激活
清理完成
STARTING
RUNNING
TERMINATEING
TERMINATED
4.2.2 HostState 状态机 Worker创建
宿主环境退出
ACTIVE
INACTIVE
4.3 AsyncLock 状态机模型 4.3.1 LockMode 状态 初始化
获取共享锁
获取排他锁
所有持有者释放
持有者释放
LOCK_MODE_UNLOCK
LOCK_MODE_SHARED
LOCK_MODE_EXCLUSIVE
4.4 状态机转换图 (综合)
execute()
executeDelayed()
cancel()
dequeue()
cancel()
timeout()
cancel()
success()
cancel()
ending()
cleanup()
NOT_FOUND
WAITING
DELAYED
CANCELED
RUNNING
FINISHED
ENDING
初始状态
等待执行
延迟中
执行中
结束中
已完成
已取消
5. 接口设计 5.1 公共接口 5.1.1 TaskPool 接口 接口名称 功能描述 参数 返回值 execute(task, priority?)执行任务 task: Task对象, priority: 优先级 Promise execute(func, ...args)执行函数任务 func: 函数, args: 参数 Promise executeDelayed(delay, task, priority?)延迟执行任务 delay: 延迟毫秒, task: Task对象 Promise executePeriodically(period, task, priority?)周期执行任务 period: 周期毫秒, task: Task对象 void cancel(task)取消任务 task: Task对象 void terminateTask(task)终止长任务 task: Task对象 void getTaskPoolInfo()获取任务池信息 无 TaskPoolInfo isConcurrent(func)判断是否为并发函数 func: 函数 boolean
5.1.2 Task 接口 接口名称 功能描述 参数 返回值 constructor(func, ...args)创建任务 func: 函数, args: 参数 Task setTransferList(list)设置转移列表 list: ArrayBuffer数组 void setCloneList(list)设置克隆列表 list: 可克隆对象数组 void isCanceled()检查是否已取消 无 boolean isDone()检查是否已完成 无 boolean sendData(...args)发送数据 args: 数据 void onReceiveData(callback)接收数据回调 callback: 回调函数 void addDependency(task)添加依赖 task: 依赖任务 void removeDependency(task)移除依赖 task: 依赖任务 void onEnqueued(callback)入队回调 callback: 回调函数 void onStartExecution(callback)开始执行回调 callback: 回调函数 void onExecutionSucceeded(callback)执行成功回调 callback: 回调函数 void onExecutionFailed(callback)执行失败回调 callback: 回调函数 void
5.1.3 Worker 接口 接口名称 功能描述 参数 返回值 constructor(script, options?)创建Worker script: 脚本路径, options: 配置 Worker postMessage(data, transfer?)发送消息 data: 数据, transfer: 转移列表 void postMessageWithSharedSendable(data)发送共享消息 data: 可共享数据 void terminate()终止Worker 无 void on(type, callback)添加事件监听 type: 事件类型, callback: 回调 void once(type, callback)添加单次监听 type: 事件类型, callback: 回调 void off(type, callback?)移除事件监听 type: 事件类型, callback: 回调 void addEventListener(type, callback)添加事件监听 type: 事件类型, callback: 回调 void removeEventListener(type, callback?)移除事件监听 type: 事件类型, callback: 回调 void dispatchEvent(event)分发事件 event: 事件对象 boolean registerGlobalCallObject(name, obj)注册全局调用对象 name: 名称, obj: 对象 void unregisterGlobalCallObject(name)注销全局调用对象 name: 名称 void
5.1.4 URL 接口 接口名称 功能描述 参数 返回值 constructor(url, base?)创建URL url: URL字符串, base: 基础URL URL href完整URL getter/setter string origin来源 getter string protocol协议 getter/setter string username用户名 getter/setter string password密码 getter/setter string host主机(含端口) getter/setter string hostname主机名 getter/setter string port端口 getter/setter string pathname路径 getter/setter string search查询字符串 getter/setter string searchParams查询参数 getter URLSearchParams hash哈希 getter/setter string toString()转字符串 无 string toJSON()转JSON 无 string
5.1.5 Buffer 接口 接口名称 功能描述 参数 返回值 alloc(size, fill?, encoding?)分配Buffer size: 大小, fill: 填充值 Buffer allocUnsafe(size)不安全分配 size: 大小 Buffer from(data, encoding?)从数据创建 data: 数据, encoding: 编码 Buffer concat(list, totalLength?)连接Buffer list: Buffer数组, totalLength: 总长度 Buffer compare(buf1, buf2)比较Buffer buf1, buf2: Buffer number isBuffer(obj)判断是否Buffer obj: 对象 boolean byteLength(string, encoding?)字节长度 string: 字符串, encoding: 编码 number copy(target, targetStart?, sourceStart?, sourceEnd?)复制 target: 目标Buffer number slice(start?, end?)切片 start: 起始, end: 结束 Buffer write(string, offset?, length?, encoding?)写入字符串 string: 字符串 number toString(encoding?, start?, end?)转字符串 encoding: 编码 string readInt32BE(offset)读取32位整数(大端) offset: 偏移 number writeInt32BE(value, offset)写入32位整数(大端) value: 值, offset: 偏移 number
5.1.6 Process 接口 接口名称 功能描述 参数 返回值 uid用户ID getter number gid组ID getter number euid有效用户ID getter number egid有效组ID getter number pid进程ID getter number ppid父进程ID getter number tid线程ID getter number cwd()当前工作目录 无 string chdir(dir)改变工作目录 dir: 目录 void uptime()运行时间 无 number kill(pid, signal)发送信号 pid: 进程ID, signal: 信号 boolean exit(code)退出进程 code: 退出码 void abort()中止进程 无 void isIsolatedProcess()是否隔离进程 无 boolean is64Bit()是否64位 无 boolean getUidForName(name)通过名称获取UID name: 用户名 number getThreadPriority(tid)获取线程优先级 tid: 线程ID number getSystemConfig(name)获取系统配置 name: 配置名 number getEnvironmentVar(name)获取环境变量 name: 变量名 string
5.1.7 Timer 接口 接口名称 功能描述 参数 返回值 setTimeout(callback, delay?, ...args)设置超时 callback: 回调, delay: 延迟 number setInterval(callback, delay?, ...args)设置间隔 callback: 回调, delay: 间隔 number clearTimeout(id)清除超时 id: 定时器ID void clearInterval(id)清除间隔 id: 定时器ID void
5.1.8 AsyncLock 接口 接口名称 功能描述 参数 返回值 constructor(name?)创建异步锁 name: 锁名称 AsyncLock lockAsync(callback, mode?, options?)异步加锁 callback: 回调, mode: 锁模式 Promise query()查询锁状态 无 LockState
5.2 数据交换接口 5.2.1 序列化协议 TaskPool和Worker使用序列化机制进行数据传递:
// 序列化支持的类型 - 基本类型: number, string, boolean, null, undefined- 对象类型: Object, Array, Map, Set- 特殊类型: ArrayBuffer, TypedArray, DataView- 可转移对象: ArrayBuffer ( 通过transferList) - 可共享对象: SharedArrayBuffer, Sendable对象5.2.2 消息格式 // Worker消息格式 interface MessageEvent { data: any ; // 消息数据 type : string ; // 消息类型 } // 错误消息格式 interface ErrorEvent { message: string ; // 错误信息 filename: string ; // 文件名 lineno: number ; // 行号 colno: number ; // 列号 error: Error; // 错误对象 } 5.3 接口调用时序图 5.3.1 TaskPool.execute 时序图 Application TaskPool TaskManager Worker Task execute(task) GenerateTask() task StoreTask(task) EnqueueTaskId(taskId, priority) NotifyExecuteTask() DequeueTaskId() taskId GetTask(taskId) task Execute() result HandleTaskResult(task) Promise.resolve(result) Application TaskPool TaskManager Worker Task
5.3.2 Worker 消息传递时序图 Application Worker(Host) MessageQueue Worker(Thread) WorkerScript new Worker(script) StartThread() LoadScript() postMessage(data) Serialize() & Push() uv_async_send() Pop() Deserialize() & onmessage() postMessage(response) Serialize() & Push() uv_async_send() onmessage event Application Worker(Host) MessageQueue Worker(Thread) WorkerScript
5.3.3 AsyncLock 加锁时序图 Application AsyncLock LockRequest AsyncLockManager Callback lockAsync(callback) new LockRequest() CanAcquireLock() AddToHeldList() ExecuteCallback() result CleanUpLockRequest() ProcessPendingLockRequest() Promise.resolve(result) AddToPendingList() 等待锁释放 alt [可以获取锁] [不能获取锁] Application AsyncLock LockRequest AsyncLockManager Callback
5.3.4 Timer 定时器时序图 Application Timer TimerTable uv_timer Callback setTimeout(callback, delay) CreateTimerCallbackInfo() uv_timer_init() uv_timer_start() timerId 等待 timeout TimerCallback() callback() DeleteTimer() Application Timer TimerTable uv_timer Callback
附录 A. 错误码定义 错误码 描述 10200001 值超出范围 10200002 参数无效 10200003 Worker初始化失败 10200004 Worker实例不支持此API 10200005 Worker未运行 10200006 序列化异常 10200007 Worker文件路径无效 10200014 任务已执行 10200015 取消不存在的任务 10200016 任务不支持取消 10200034 任务组已执行
B. 平台兼容性 平台 支持状态 备注 OpenHarmony ✅ 完全支持 主要目标平台 Windows ✅ 支持 开发调试用 macOS ✅ 支持 开发调试用 iOS ⚠️ 部分支持 部分功能受限 Android ⚠️ 部分支持 部分功能受限
C. 性能指标 指标 参考值 说明 ROM占用 ~1400KB 编译后代码大小 RAM占用 ~4096KB 运行时内存占用 线程池大小 CPU核心数-1 动态调整 任务队列容量 无限制 受内存限制