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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部