背景与价值在 CPU 密集型任务中使用多 Worker 提升吞吐并降低主线程阻塞,配合取消保障交互优先。Pool 实现type Task<T> = { id: number; payload: T; ac: AbortController; resolve: (v:any)=>void; reject: (e:any)=>void }; export class WorkerPool<T> { size: number; workers: Worker[] = []; queue: Task<T>[] = []; busy: Set<number> = new Set(); seq = 0; constructor(url: string, size = 4) { this.size = size; for (let i=0;i<size;i++) this.spawn(url); } spawn(url: string) { const w = new Worker(url, { type: 'module' }); const id = this.workers.push(w) - 1; w.onmessage = e => this.onResult(id, e.data); } run(payload: T) { const ac = new AbortController(); return new Promise((resolve, reject) => { this.queue.push({ id: this.seq++, payload, ac, resolve, reject }); this.schedule(); }); } cancel(id: number) { const t = this.queue.find(x=>x.id===id); if (t) t.ac.abort(); } schedule() { for (let i=0;i<this.workers.length;i++) { if (this.busy.has(i)) continue; const task = this.queue.shift(); if (!task) break; this.busy.add(i); this.workers[i].postMessage({ id: task.id, payload: task.payload }); (this.workers[i] as any)._current = task; } } onResult(i: number, msg: any) { const task = (this.workers[i] as any)._current as Task<T>; this.busy.delete(i); if (msg.error) task.reject(msg.error); else task.resolve(msg.result); (this.workers[i] as any)._current = null; this.schedule(); } } Worker 端self.onmessage = e => { const { id, payload } = e.data; const result = heavyCompute(payload); (self as any).postMessage({ id, result }); }; 指标验证(Chrome 128/Edge 130)吞吐:相较单线程提升 1.8×–3.2×(设备差异)。交互影响:INP 增量 ≤ 70ms,取消后交互优先无阻塞。稳定性:长时间运行无资源泄露与死锁。回退策略不支持 Worker 的环境降级为主线程分片处理。测试清单大量任务与并发:结果正确且队列稳定;取消可用。

发表评论 取消回复