news 2025/12/14 7:37:28

【OpenHarmony】OpenHarmony ETS Utils实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【OpenHarmony】OpenHarmony ETS Utils实现

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 设计目标

  1. 高性能: 采用C++实现核心功能,通过N-API与JavaScript层交互
  2. 跨平台: 支持OHOS、Windows、Mac、iOS、Android等多平台
  3. 线程安全: 提供完善的并发控制机制
  4. 易用性: 提供简洁的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 依赖组件

依赖组件用途
napiN-API接口,实现JS与C++交互
libuv异步I/O和事件循环
ffrt函数流运行时,任务调度
hilog日志系统
hisysevent系统事件上报
icu国际化支持
openssl加密支持
libxml2XML解析库

1.3 设计思路与模式

1.3.1 设计思路

  1. 分层架构设计

    • JavaScript层: 提供用户友好的API接口
    • N-API绑定层: 实现JS与C++的桥接
    • C++核心层: 实现核心业务逻辑
    • 平台适配层: 处理跨平台差异
  2. 模块化设计

    • 各子模块功能独立,低耦合
    • 统一的错误处理机制
    • 共享公共工具类
  3. 异步优先设计

    • 大量使用异步操作避免阻塞
    • 基于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 类 (任务类)
classTask{public:// 构造函数Task()=default;Task(napi_env env,TaskType taskType,constchar*name);~Task()=default;// 静态工厂方法staticTask*GenerateTask(napi_env env,napi_value task,napi_value func,napi_value name,napi_value*args,size_t argc);staticTask*GenerateFunctionTask(napi_env env,napi_value func,napi_value*args,size_t argc,TaskType type);staticTaskInfo*GenerateTaskInfo(napi_env env,napi_value func,napi_value args,napi_value transferList,napi_value cloneList,Priority priority,booldefaultTransfer=true,booldefaultCloneSendable=false);// N-API 回调方法staticnapi_valueTaskConstructor(napi_env env,napi_callback_info cbinfo);staticnapi_valueSetTransferList(napi_env env,napi_callback_info cbinfo);staticnapi_valueIsCanceled(napi_env env,napi_callback_info cbinfo);staticnapi_valueSendData(napi_env env,napi_callback_info cbinfo);staticnapi_valueAddDependency(napi_env env,napi_callback_info cbinfo);staticnapi_valueRemoveDependency(napi_env env,napi_callback_info cbinfo);// 状态管理方法boolUpdateTaskStateToWaiting();boolUpdateTaskStateToRunning();boolUpdateTaskStateToCanceled();boolUpdateTaskStateToFinished();// 任务属性boolIsRepeatableTask()const;boolIsGroupTask()const;boolIsLongTask()const;boolIsPeriodicTask()const;public:// 成员变量napi_env env_=nullptr;std::atomic<TaskType>taskType_{TaskType::TASK};std::string name_{};uint32_ttaskId_{};std::atomic<ExecuteState>taskState_{ExecuteState::NOT_FOUND};uint64_tgroupId_{};uint64_tseqRunnerId_{};TaskInfo*currentTaskInfo_{};std::list<TaskInfo*>pendingTaskInfos_{};void*result_=nullptr;std::atomic<bool>success_{true};void*worker_{nullptr};// ... 更多成员};
TaskManager 类 (任务管理器 - 单例)
classTaskManager{public:// 单例获取staticTaskManager&GetInstance();// 任务管理voidStoreTask(Task*task);boolRemoveTask(uint32_ttaskId);Task*GetTask(uint32_ttaskId);voidEnqueueTaskId(uint32_ttaskId,Priority priority=Priority::DEFAULT);std::pair<uint32_t,Priority>DequeueTaskId();voidCancelTask(napi_env env,uint32_ttaskId);// Worker管理voidNotifyWorkerIdle(Worker*worker);voidNotifyWorkerCreated(Worker*worker);voidNotifyWorkerRunning(Worker*worker);voidRemoveWorker(Worker*worker);// 负载均衡voidInitTaskManager(napi_env env);voidUpdateExecutedInfo(uint64_tduration);voidTryTriggerExpand();// 状态查询uint32_tGetTaskNum();uint32_tGetIdleWorkers();uint32_tGetThreadNum();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 类 (工作线程)
classWorker{public:// 状态枚举enumRunnerState{STARTING,RUNNING,TERMINATEING,TERMINATED};enumHostState{ACTIVE,INACTIVE};enumListenerMode{ONCE,PERMANENT};enumScriptMode{CLASSIC,MODULE};// 构造与析构Worker(napi_env env,napi_ref thisVar);~Worker();// 静态方法 - N-API回调staticnapi_valuePostMessage(napi_env env,napi_callback_info cbinfo);staticnapi_valueTerminate(napi_env env,napi_callback_info cbinfo);staticnapi_valueOn(napi_env env,napi_callback_info cbinfo);staticnapi_valueOff(napi_env env,napi_callback_info cbinfo);staticnapi_valueConstructor(napi_env env,napi_callback_info cbinfo,boollimitSign=false,WorkerVersion version=WorkerVersion::NONE);// 消息处理staticvoidHostOnMessage(constuv_async_t*req);staticvoidWorkerOnMessage(constuv_async_t*req);staticvoidExecuteInThread(constvoid*data);// 状态管理boolUpdateWorkerState(RunnerState state);boolIsRunning()const;boolIsTerminated()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 类
classURL{public:// 构造函数explicitURL(conststd::string&input);URL(conststd::string&input,conststd::string&base);URL(conststd::string&input,constURL&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方法voidSetHostname(conststd::string&input);voidSetUsername(conststd::string&input);voidSetPassword(conststd::string&input);voidSetScheme(conststd::string&input);voidSetFragment(conststd::string&input);voidSetSearch(conststd::string&input);voidSetHost(conststd::string&input);voidSetPort(conststd::string&input);voidSetHref(conststd::string&input);voidSetPath(conststd::string&input);private:UrlData urlData_;std::bitset<11>flags_;};
Buffer 类
classBuffer{public:Buffer()=default;virtual~Buffer();// 初始化方法voidInit(uint32_tsize);voidInit(Buffer*buffer);voidInit(Buffer*pool,unsignedintpoolOffset,unsignedintlength);voidInit(uint8_t*buffer,unsignedintbyteOffset,unsignedintlength);// 属性访问unsignedintGetLength();voidSetLength(unsignedintlen);unsignedintGetByteOffset();int32_tGet(uint32_tindex);voidSet(uint32_tindex,uint8_tvalue);// 读写方法voidWriteInt32BE(int32_tvalue,uint32_toffset);voidWriteInt32LE(int32_tvalue,uint32_toffset);int32_tReadInt32BE(uint32_toffset);int32_tReadInt32LE(uint32_toffset);// 字符串操作unsignedintWriteString(std::string value,unsignedintsize);unsignedintWriteString(std::string value,unsignedintoffset,unsignedintlength,std::string encoding);// Buffer操作voidSubBuffer(Buffer*tBuf,uint32_tstart,uint32_tend);uint32_tCopy(Buffer*tBuf,uint32_ttStart,uint32_tsStart,uint32_tsEnd);intCompare(Buffer*tBuf,uint32_ttargetStart,uint32_tsourceStart,uint32_tlength);private:uint8_t*raw_{nullptr};unsignedintbyteOffset_{};unsignedintlength_{};boolneedRelease_{true};};

2.2.2 关键结构体

// 任务执行状态enumExecuteState{NOT_FOUND,// 未找到WAITING,// 等待中RUNNING,// 执行中CANCELED,// 已取消FINISHED,// 已完成DELAYED,// 延迟中ENDING// 结束中};// 任务类型enumTaskType{TASK,// 普通任务FUNCTION_TASK,// 函数任务SEQRUNNER_TASK,// 序列运行器任务COMMON_TASK,// 通用任务GROUP_COMMON_TASK,// 组通用任务GROUP_FUNCTION_TASK,// 组函数任务ASYNCRUNNER_TASK// 异步运行器任务};// 任务优先级enumPriority{HIGH=0,// 高优先级MEDIUM=1,// 中优先级LOW=2,// 低优先级IDLE=3,// 空闲优先级DEFAULT=MEDIUM,NUMBER=4};// 任务信息结构体structTaskInfo{napi_deferred deferred=nullptr;Priority priority=Priority::DEFAULT;void*serializationFunction=nullptr;void*serializationArguments=nullptr;};// 任务组信息structGroupInfo{uint32_tfinishedTaskNum{};napi_ref resArr{nullptr};Priority priority{Priority::DEFAULT};napi_deferred deferred{nullptr};int32_tfailedIndex{-1};};// 定时器回调信息structTimerCallbackInfo{napi_env env_{nullptr};uint32_ttId_{};int32_ttimeout_{};napi_ref callback_{};boolrepeat_{};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_FOUND0任务未找到/初始状态
WAITING1等待执行
RUNNING2正在执行
CANCELED3已取消
FINISHED4已完成
DELAYED5延迟执行中
ENDING6结束中

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_FOUNDWAITING任务入队UpdateTaskStateToWaiting()
NOT_FOUNDDELAYED延迟任务入队UpdateTaskStateToDelayed()
NOT_FOUNDCANCELED任务取消UpdateTaskStateToCanceled()
WAITINGRUNNING工作线程获取任务UpdateTaskStateToRunning()
WAITINGCANCELED用户取消任务UpdateTaskStateToCanceled()
DELAYEDWAITING延迟时间到达UpdateTaskStateToWaiting()
DELAYEDCANCELED用户取消任务UpdateTaskStateToCanceled()
RUNNINGFINISHED任务执行完成UpdateTaskStateToFinished()
RUNNINGCANCELED任务执行中取消UpdateTaskStateToCanceled()
RUNNINGENDING任务开始结束UpdateTaskStateToEnding()
ENDINGFINISHED结束处理完成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?)创建Workerscript: 脚本路径, options: 配置Worker
postMessage(data, transfer?)发送消息data: 数据, transfer: 转移列表void
postMessageWithSharedSendable(data)发送共享消息data: 可共享数据void
terminate()终止Workervoid
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?)创建URLurl: URL字符串, base: 基础URLURL
href完整URLgetter/setterstring
origin来源getterstring
protocol协议getter/setterstring
username用户名getter/setterstring
password密码getter/setterstring
host主机(含端口)getter/setterstring
hostname主机名getter/setterstring
port端口getter/setterstring
pathname路径getter/setterstring
search查询字符串getter/setterstring
searchParams查询参数getterURLSearchParams
hash哈希getter/setterstring
toString()转字符串string
toJSON()转JSONstring

5.1.5 Buffer 接口

接口名称功能描述参数返回值
alloc(size, fill?, encoding?)分配Buffersize: 大小, fill: 填充值Buffer
allocUnsafe(size)不安全分配size: 大小Buffer
from(data, encoding?)从数据创建data: 数据, encoding: 编码Buffer
concat(list, totalLength?)连接Bufferlist: Buffer数组, totalLength: 总长度Buffer
compare(buf1, buf2)比较Bufferbuf1, buf2: Buffernumber
isBuffer(obj)判断是否Bufferobj: 对象boolean
byteLength(string, encoding?)字节长度string: 字符串, encoding: 编码number
copy(target, targetStart?, sourceStart?, sourceEnd?)复制target: 目标Buffernumber
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用户IDgetternumber
gid组IDgetternumber
euid有效用户IDgetternumber
egid有效组IDgetternumber
pid进程IDgetternumber
ppid父进程IDgetternumber
tid线程IDgetternumber
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)通过名称获取UIDname: 用户名number
getThreadPriority(tid)获取线程优先级tid: 线程IDnumber
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: 定时器IDvoid
clearInterval(id)清除间隔id: 定时器IDvoid

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消息格式interfaceMessageEvent{data:any;// 消息数据type:string;// 消息类型}// 错误消息格式interfaceErrorEvent{message:string;// 错误信息filename:string;// 文件名lineno:number;// 行号colno:number;// 列号error:Error;// 错误对象}

5.3 接口调用时序图

5.3.1 TaskPool.execute 时序图

ApplicationTaskPoolTaskManagerWorkerTaskexecute(task)GenerateTask()taskStoreTask(task)EnqueueTaskId(taskId, priority)NotifyExecuteTask()DequeueTaskId()taskIdGetTask(taskId)taskExecute()resultHandleTaskResult(task)Promise.resolve(result)ApplicationTaskPoolTaskManagerWorkerTask

5.3.2 Worker 消息传递时序图

ApplicationWorker(Host)MessageQueueWorker(Thread)WorkerScriptnew Worker(script)StartThread()LoadScript()postMessage(data)Serialize() & Push()uv_async_send()Pop()Deserialize() & onmessage()postMessage(response)Serialize() & Push()uv_async_send()onmessage eventApplicationWorker(Host)MessageQueueWorker(Thread)WorkerScript

5.3.3 AsyncLock 加锁时序图

ApplicationAsyncLockLockRequestAsyncLockManagerCallbacklockAsync(callback)new LockRequest()CanAcquireLock()AddToHeldList()ExecuteCallback()resultCleanUpLockRequest()ProcessPendingLockRequest()Promise.resolve(result)AddToPendingList()等待锁释放alt[可以获取锁][不能获取锁]ApplicationAsyncLockLockRequestAsyncLockManagerCallback

5.3.4 Timer 定时器时序图

ApplicationTimerTimerTableuv_timerCallbacksetTimeout(callback, delay)CreateTimerCallbackInfo()uv_timer_init()uv_timer_start()timerId等待 timeoutTimerCallback()callback()DeleteTimer()ApplicationTimerTimerTableuv_timerCallback

附录

A. 错误码定义

错误码描述
10200001值超出范围
10200002参数无效
10200003Worker初始化失败
10200004Worker实例不支持此API
10200005Worker未运行
10200006序列化异常
10200007Worker文件路径无效
10200014任务已执行
10200015取消不存在的任务
10200016任务不支持取消
10200034任务组已执行

B. 平台兼容性

平台支持状态备注
OpenHarmony✅ 完全支持主要目标平台
Windows✅ 支持开发调试用
macOS✅ 支持开发调试用
iOS⚠️ 部分支持部分功能受限
Android⚠️ 部分支持部分功能受限

C. 性能指标

指标参考值说明
ROM占用~1400KB编译后代码大小
RAM占用~4096KB运行时内存占用
线程池大小CPU核心数-1动态调整
任务队列容量无限制受内存限制
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/12 19:05:18

23、Linux Web服务器综合指南

Linux Web服务器综合指南 1. 引言 在Linux系统中,有多种Web服务器可供选择,它们各有特点和优势。本文将详细介绍这些Web服务器,包括Apache、Tux等,以及它们的配置、使用和相关技术。 2. Linux系统中的Web服务器概述 Linux发行版提供了多种Web服务器,其中Apache是最主要…

作者头像 李华
网站建设 2025/12/12 19:05:14

3小时精通Halo仪表盘组件开发:从零到一的完整实战手册

在当今快速发展的Web开发领域&#xff0c;Halo仪表盘组件开发已成为构建现代化管理后台的关键技能。本文将通过系统化的实战路径&#xff0c;带你深入掌握Halo仪表盘组件的设计精髓与实现技巧&#xff0c;让你在短短3小时内从新手成长为组件开发专家。 【免费下载链接】halo 强…

作者头像 李华
网站建设 2025/12/12 19:05:12

Kali Linux 高级Web渗透测试工具全解析:构建专业级安全评估能力

引言&#xff1a;Web安全评估的现代挑战与Kali Linux的价值定位 在数字化时代&#xff0c;Web应用已成为企业服务交付、用户交互和数据交换的核心载体。随着云计算、微服务架构和API经济的蓬勃发展&#xff0c;Web应用的安全边界不断扩展&#xff0c;攻击面也日益复杂。根据OWA…

作者头像 李华
网站建设 2025/12/12 19:04:22

湖泊数据在科研与工程中的应用

湖泊作为重要的内陆水体&#xff0c;在水文循环、生态系统及区域气候中扮演关键角色。定量描述湖泊物理状态需要一系列专业参数。本文将系统介绍湖泊相关核心数据&#xff0c;并说明其在科研与工程中的实际应用。 一、湖泊核心参数概述 一套完整的湖泊物理数据集通常包含以下…

作者头像 李华
网站建设 2025/12/12 19:03:15

RDP Wrapper配置库完全使用指南:解锁Windows远程桌面全部潜能

RDP Wrapper配置库完全使用指南&#xff1a;解锁Windows远程桌面全部潜能 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini RDP Wrapper Library是一个强大的开源工具&#x…

作者头像 李华
网站建设 2025/12/12 19:02:25

官宣!TDengine 授权麦斯时代为钻石分销商,共筑工业数据新生态

当前&#xff0c;工业数字化转型进入深水区&#xff0c;时序数据作为工业设备运维、生产监控、能源管理等场景的核心数据载体&#xff0c;市场需求呈现爆发式增长。涛思数据始终坚持 “技术驱动 生态共建” 的发展战略&#xff0c;通过构建完善的分销商体系&#xff0c;让 TDe…

作者头像 李华