useWorkerPool
创建 Web Worker 线程池,管理多个 Worker 并发执行任务。
前置依赖
依赖参数
| 参数名 | 类型 | 说明 |
|---|---|---|
deps.Worker | WorkerConstructor | Worker 构造函数 |
deps.setTimeout | typeof setTimeout | 设置定时器 |
deps.clearTimeout | typeof clearTimeout | 清除定时器 |
deps.setInterval | typeof setInterval | 设置间隔定时器 |
deps.clearInterval | typeof 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.scriptURL | string | 是 | - | Worker 脚本的 URL |
options.poolSize | number | 否 | 4 | 线程池中 Worker 的数量 |
options.maxQueueSize | number | 否 | 100 | 任务队列的最大长度 |
options.taskTimeout | number | 否 | 30000 | 单个任务的超时时间(毫秒) |
deps | WorkerPoolDeps | 是 | - | 依赖注入对象 |
返回值
| 类型 | 说明 |
|---|---|
WorkerPool | Worker 线程池对象 |
工作原理
初始化线程池:
- 创建指定数量的 Worker 实例
- 初始化任务队列
- 标记所有 Worker 为空闲状态
execute(data):
- 检查队列是否已满(超过 maxQueueSize)
- 创建任务对象(包含数据和 Promise)
- 添加到任务队列
- 尝试分配 Worker 执行
- 返回 Promise
任务分配:
- 遍历 Worker 池查找空闲 Worker
- 如果有空闲 Worker:
- 分配任务给该 Worker
- 标记 Worker 为忙碌
- 发送数据到 Worker
- 设置超时定时器
- 如果没有空闲 Worker:
- 任务留在队列中等待
任务完成:
- Worker 返回结果后 resolve Promise
- 标记 Worker 为空闲
- 从队列中取出下一个任务并分配
错误和超时:
- Worker 错误或超时时 reject Promise
- 重启 Worker(替换失败的 Worker)
- 处理队列中的下一个任务
终止线程池:
terminate()终止所有 Worker- 清空任务队列
- 清理所有定时器
通过复用 Worker 实例,避免频繁创建销毁 Worker 的开销,适合批量处理大量任务。