Skip to content

实时与并发

元信息

  • 目标:理解浏览器 JS 单线程事件循环的两类束缚各用什么解——WebSocket 让服务器能主动推(实时通讯),Web Worker 让重计算不卡界面(并发执行)
  • 关键概念:WebSocket、全双工、轮询、Web Worker、postMessage、SharedWorker
  • 关联阶段:cp4
  • 常见误区:以为 HTTP 也能让服务器主动推送(普通 HTTP 只能客户端先开口,靠轮询模拟推送低效且延迟高);以为 Worker 里能操作 DOM(Worker 不共享 DOM,两端只能靠消息传递数据副本);以为异步就是并发(Promise/事件循环解决"等待不卡",Worker 才解决"计算不卡")

主线程之外的世界

浏览器的 JS 运行在一个单线程的事件循环上——实时通讯的长连接与重计算都必须避免阻塞它。两类技术各解一题:

  • 实时通讯:页面与服务器如何"随时互发消息"——WebSocket
  • 并发执行:页面内如何"多干活不卡界面"——Web Worker

WebSocket:从"一问一答"到"双向对话"

HTTP 的请求-响应模型里,永远是客户端先开口。聊天室、协同编辑、行情推送这类"服务器主动推"的场景,靠 HTTP 只能轮询(不断发问"有新的吗?"),低效且延迟高。

  • WebSocket 通过一次 HTTP 握手升级为持久的全双工 TCP 连接,此后两端随时互发消息
  • API 即事件风格:onopen / onmessage / onclose
import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

  • 呼应ajax:ajax 解决"请求不必刷新",WebSocket 解决"响应不必等待请求"
  • 更高层的封装:SSE(服务器单向流,见HTTP流式响应)、Socket.IO(自动降级与房间语义)

Web Worker:把重活搬出主线程

Worker 是真正的并行线程:把重计算(大文件解析、图像处理、复杂数学)交给它,主线程保持响应。约束是不共享 DOM——两端靠消息传递(postMessage)通信,数据被复制(或 Transferable 转移)。

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

  • 变体:SharedWorker(多标签页共享一个 worker)、Service Worker(PWA 的网络代理,见PWA
  • 呼应异步:Promise/事件循环解决"等待不卡",Worker 解决"计算不卡"

素材