作用:
- TaskPool(任务池)和 Worker 都为应用程序提供多线程运行环境,用于处理耗时的计算任务或其他密集型任务,避免阻塞主线程,提高系统性能。
实现特点对比:
- 内存模型:TaskPool 和 Worker 都提供线程间隔离,内存不共享。
- 参数传递机制:两者都采用结构化克隆算法进行序列化、反序列化,完成参数传递,并支持 ArrayBuffer 转移和 SharedArrayBuffer 共享。
- 参数传递:TaskPool 直接传递参数,无需封装,默认进行 transfer;Worker 需要自己封装消息对象作为唯一参数。
- 方法调用:TaskPool 直接将方法传入调用;Worker 在线程中进行消息解析并调用对应方法。
- 返回值:TaskPool 异步调用后默认返回;Worker 主动发送消息,需在 onmessage 解析赋值。
- 生命周期:TaskPool 自行管理生命周期;开发者自行管理 Worker 的数量及生命周期。
- 任务池个数上限:TaskPool 自动管理,无需配置;同个进程下,Worker 最多支持同时开启 8 个线程。
- 任务执行时长上限:两者均无限制。
- 设置任务的优先级:两者都不支持。
- 执行任务的取消:TaskPool 支持取消任务队列中等待的任务;Worker 不支持。
适用场景对比:
- TaskPool 适合独立任务维度,超长任务会被系统自动回收;Worker 适合长时间占据线程执行,需要主动管理线程生命周期的场景。
TaskPool 运作机制:
- 支持在主线程封装任务抛给任务队列,系统选择合适的工作线程进行任务分发及执行,并将结果返回给主线程。
Worker 运作机制:
- 创建 Worker 的线程称为宿主线程,Worker 子线程与宿主线程拥有独立的实例,通信基于消息传递。
注意事项:
- TaskPool 和 Worker 实现的任务函数需要使用装饰器标注,且入参需满足序列化支持的类型。
- 实现任务的函数需要使用装饰器@Concurrent标注,且仅支持在.ets文件中使用。
- Worker创建后需要手动管理生命周期,且最多同时运行的Worker子线程数量为8个。
- Ability类型的Module支持使用Worker,Library类型的Module不支持使用Worker。
- 创建Worker不支持使用其他Module的Worker.ts文件,即不支持跨模块调用Worker。
- 由于不同线程中上下文对象是不同的,两者工作线程只能使用线程安全的库。
- 序列化传输的数据量大小限制为 16MB。