如何用 Shared Worker 处理多标签页抢占同个本地资源的竞争

张开发
2026/4/19 0:14:23 15 分钟阅读

分享文章

如何用 Shared Worker 处理多标签页抢占同个本地资源的竞争
Shared Worker 是浏览器中唯一支持多标签页、iframe 和 Service Worker 共享同一上下文的 API适合作为本地资源访问的中央调度器通过消息队列串行处理请求、配对响应、超时清理及共享状态广播来避免竞态与雪崩。Shared Worker 是浏览器中唯一能让多个标签页、iframe 甚至 Service Worker 共享同一上下文的 Web API。它天然适合协调跨标签页对本地资源如 IndexedDB、localStorage、WebSQL、甚至内存缓存或 WebSocket 连接的并发访问避免竞态条件。关键不在于“锁住资源”而在于把资源操作统一收口到 Shared Worker 中由它串行调度、状态仲裁。用 Shared Worker 做资源访问的中央调度器不要让每个页面直接读写 localStorage 或打开 IndexedDB 数据库而是让所有页面通过 port.postMessage() 向 Shared Worker 发起请求例如 { type: get, key: userPrefs }Worker 内部维护一个待处理队列按接收顺序依次执行并用 postMessage 把结果回传给对应页面。示例逻辑每个页面创建 new SharedWorker(resource-manager.js)监听 worker.port.onmessage Shared Worker 收到请求后不立即执行而是推入 queue.push({ resolve, reject, ...req }) Worker 启动一个 processQueue() 循环取队首任务 → 执行如 indexedDB.open() 事务→ resolve(result) → 继续下一条 若某次操作失败如 DB 被其他进程删除Worker 可广播通知所有页面“资源不可用”而非让各页面自行重试导致雪崩用 MessageChannel 配合端口标识实现请求-响应配对多个标签页可能同时发请求Worker 必须确保响应准确回到发起者。Shared Worker 的 port 是唯一的但默认消息不带上下文。推荐做法 知元AI AI智能语音聊天 对讲问答 AI绘画 AI写作 AI创作助手工具

更多文章