Skip to content

useWorkerPool

创建 Web Worker 线程池,管理多个 Worker 并发执行任务。

前置依赖

依赖参数

参数名类型说明
deps.WorkerWorkerConstructorWorker 构造函数
deps.setTimeouttypeof setTimeout设置定时器
deps.clearTimeouttypeof clearTimeout清除定时器
deps.setIntervaltypeof setInterval设置间隔定时器
deps.clearIntervaltypeof clearInterval清除间隔定时器

环境要求

  • 浏览器环境: 使用 Web Worker API

函数签名

typescript
function useWorkerPool(
  options: WorkerPoolOptions,
  deps: WorkerPoolDeps
): WorkerPool

interface WorkerPoolOptions {
  scriptURL: string           // Worker 脚本 URL
  poolSize?: number           // 线程池大小,默认 4
  maxQueueSize?: number       // 最大队列大小,默认 100
  taskTimeout?: number        // 单个任务超时(毫秒),默认 30000
}

interface WorkerPoolDeps {
  Worker: WorkerConstructor
  setTimeout: typeof setTimeout
  clearTimeout: typeof clearTimeout
  setInterval: typeof setInterval
  clearInterval: typeof clearInterval
}

interface WorkerPool {
  execute: <T, R>(data: T) => Promise<R>
  terminate: () => void
  getStats: () => PoolStats
}

interface PoolStats {
  activeWorkers: number
  queueSize: number
  completedTasks: number
  failedTasks: number
}

参数

参数名类型必填默认值说明
options.scriptURLstring-Worker 脚本的 URL
options.poolSizenumber4线程池中 Worker 的数量
options.maxQueueSizenumber100任务队列的最大长度
options.taskTimeoutnumber30000单个任务的超时时间(毫秒)
depsWorkerPoolDeps-依赖注入对象

返回值

类型说明
WorkerPoolWorker 线程池对象

工作原理

  1. 初始化线程池

    • 创建指定数量的 Worker 实例
    • 初始化任务队列
    • 标记所有 Worker 为空闲状态
  2. execute(data)

    • 检查队列是否已满(超过 maxQueueSize)
    • 创建任务对象(包含数据和 Promise)
    • 添加到任务队列
    • 尝试分配 Worker 执行
    • 返回 Promise
  3. 任务分配

    • 遍历 Worker 池查找空闲 Worker
    • 如果有空闲 Worker:
      • 分配任务给该 Worker
      • 标记 Worker 为忙碌
      • 发送数据到 Worker
      • 设置超时定时器
    • 如果没有空闲 Worker:
      • 任务留在队列中等待
  4. 任务完成

    • Worker 返回结果后 resolve Promise
    • 标记 Worker 为空闲
    • 从队列中取出下一个任务并分配
  5. 错误和超时

    • Worker 错误或超时时 reject Promise
    • 重启 Worker(替换失败的 Worker)
    • 处理队列中的下一个任务
  6. 终止线程池

    • terminate() 终止所有 Worker
    • 清空任务队列
    • 清理所有定时器

通过复用 Worker 实例,避免频繁创建销毁 Worker 的开销,适合批量处理大量任务。