TaskPool 和 Worker 的对比

作用

  • 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。
posted @ 2024-04-01 20:40  西北野狼  阅读(448)  评论(0)    收藏  举报