鸿蒙 并发编程工具集
鸿蒙系统提供完善的并发编程API体系,包含Worker线程、TaskPool任务池、同步机制和异步编程方案。Worker适合长期后台任务,TaskPool针对短时计算,@Concurrent装饰器处理纯函数并发。同步机制支持Lock/Semaphore等线程安全控制,异步编程提供Promise/async-await支持。开发者可根据任务特性选择合适方案:计算密集型用Worker,轻量级任务用Ta
·
本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、核心并发分类
1. 线程管理
API模块 | 核心功能 | 典型应用场景 |
---|---|---|
Worker | 后台线程管理 | 计算密集型任务 |
TaskPool | 轻量级任务池 | 短时异步任务 |
@Concurrent装饰器 | 标记并发函数 |
2. 同步机制
API模块 | 核心功能 | 典型应用场景 |
---|---|---|
Atomics | 共享内存原子操作 | 多线程数据同步 |
Lock/Semaphore | 互斥锁/信号量 | 资源访问控制 |
Barrier | 线程屏障 | 多阶段并行计算 |
3. 异步编程
API模块 | 核心功能 | 典型应用场景 |
---|---|---|
Promise | 异步任务链 | 网络请求处理 |
async/await | 协程式编程 | 异步流程控制 |
EventEmitter | 事件通知 | 组件间通信 |
二、Worker多线程开发
基础使用示例
// 主线程
const worker = new Worker('workers/myWorker.ets');
// 发送消息
worker.postMessage({ command: 'calculate', data: 100 });
// 接收消息
worker.onmessage = (e) => {
console.log('Result:', e.data);
};
// workers/myWorker.ets
self.onmessage = (e) => {
if (e.data.command === 'calculate') {
const result = heavyCalculation(e.data.data);
self.postMessage(result);
}
};
高级功能
- 线程间传输大数据:使用
postMessage
的transfer参数
const buffer = new ArrayBuffer(1024);
worker.postMessage(buffer, [buffer]); // 转移所有权
- 错误处理:
worker.onerror = (err) => {
console.error('Worker error:', err);
};
三、TaskPool任务池
轻量级并发方案
import { taskpool } from '@ohos.taskpool';
@Concurrent
function computeTask(x: number): number {
return x * x;
}
async function runTask() {
const task = new taskpool.Task(computeTask, 5);
const result = await taskpool.execute(task);
console.log(result); // 25
}
性能特点
- 相比Worker开销更小
- 适合短时任务(建议<3秒)
- 自动负载均衡
四、同步
1. Lock实现
import { Lock } from '@ohos.lock';
const lock = new Lock();
async function safeUpdate() {
await lock.lock();
try {
// 临界区代码
} finally {
lock.unlock();
}
}
2. Semaphore示例
import { Semaphore } from '@ohos.semaphore';
const sem = new Semaphore(3); // 允许3个并发
async function limitedResource() {
await sem.acquire();
try {
// 受限资源访问
} finally {
sem.release();
}
}
五、异步编程
1. Promise链式调用
function fetchData(): Promise<string> {
return new Promise((resolve) => {
setTimeout(() => resolve('Data loaded'), 1000);
});
}
fetchData()
.then(data => processData(data))
.catch(err => handleError(err));
2. async/await优化
async function loadContent() {
try {
const data = await fetchData();
const result = await processData(data);
return result;
} catch (err) {
console.error(err);
}
}
六、并发工具对比
方案 | 适用场景 | 内存隔离 | 通信开销 | 开发复杂度 |
---|---|---|---|---|
Worker | 长期后台任务 | 完全隔离 | 较高 | 中 |
TaskPool | 短期计算任务 | 部分隔离 | 低 | 低 |
@Concurrent | 纯计算函数 | 无隔离 | 最低 | 最低 |
七、建议
- 线程选择策略:
2. 性能优化技巧:
- 避免频繁创建/销毁Worker
- 使用
transfer
减少数据拷贝 - 合理设置TaskPool大小(默认4个线程)
鸿蒙的并发API体系兼顾了性能与易用性,应根据任务特性选择合适方案。对于复杂场景,可以组合使用多种并发机制,如Worker+Atomics实现高性能计算,或TaskPool+Promise处理并行IO等。
更多推荐
所有评论(0)