背景与价值在 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 的环境降级为主线程分片处理。测试清单大量任务与并发:结果正确且队列稳定;取消可用。

发表评论 取消回复