作用:
- 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
西北野狼
阅读(
349)
评论()
编辑
收藏
举报
点击右上角即可分享
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2017-04-01 java多线程 -- Condition 控制线程通信
2015-04-01 android5.0----SVG