无需登录 数据私有 本地保存

Web Worker 线程池演示 - 多任务并行处理

32
0
0
0
Web Worker 线程池演示
就绪
任务配置
线程池大小
4 个线程
任务数量
12 个任务
计算复杂度
线程状态 空闲: 4 / 4
空闲 忙碌 待创建
任务队列 0 等待中
暂无任务
整体进度 0%
实时统计
0
已完成
0.00s
已用时间
-
平均耗时/任务
-
预估加速比
执行日志 0 条
等待任务开始...
性能对比结果
-
线程池总耗时
-
单Worker总耗时
-
实际加速比
-
并行效率
相关知识点 & FAQ

Web Worker 是浏览器提供的多线程API,允许在后台线程中运行JavaScript代码,不阻塞主线程(UI线程)。主线程负责渲染和用户交互,Worker线程处理计算密集型任务(如大量数据处理、复杂算法、加密解密等),两者通过 postMessage 进行通信。这解决了单线程JavaScript在执行耗时操作时导致页面卡顿、无响应的问题。

直接为每个任务创建和销毁Worker会产生较大的开销(内存分配、线程启动)。线程池预创建固定数量的Worker并复用它们,任务通过队列调度分配给空闲Worker。这减少了创建/销毁的开销,同时控制了并发数量,避免过多线程竞争CPU资源。线程池是资源池化模式在前端的典型应用。

最佳线程池大小通常接近 navigator.hardwareConcurrency(CPU逻辑核心数),一般为4-8。过少的线程无法充分利用多核CPU;过多的线程会导致上下文切换开销增大,反而降低性能。对于I/O密集型任务可以适当增加,对于纯CPU计算密集型任务,建议设置为逻辑核心数

Worker线程无法访问DOM无法使用window对象无法访问localStorage(但可以使用IndexedDB)。它们只能通过postMessage与主线程通信,传递的数据会被结构化克隆(有性能开销),可以使用Transferable对象(如ArrayBuffer)实现零拷贝传输。此外,Worker不能同步调用主线程方法。

Transferable对象(如ArrayBufferMessagePortImageBitmap)在传递给Worker时采用零拷贝方式——所有权从发送方转移到接收方,发送方不再持有该对象。这避免了结构化克隆带来的内存复制开销,对于大型数据(如几MB的ArrayBuffer)性能提升非常显著。

Dedicated Worker(专用Worker)仅能被创建它的页面使用,页面关闭则Worker终止。本演示工具使用的就是Dedicated Worker。Shared Worker(共享Worker)可被多个同源页面(如多个标签页)共享访问,适用于跨页面通信和共享状态场景。Shared Worker使用port进行通信,生命周期独立于单个页面。