事件循环在多 worker 环境中完全隔离——每个 worker 拥有独立事件循环、任务队列、调用栈和定时器队列;通信仅通过 postmessage 异步传递,内存不共享;错误、定时器、fetch 回调、资源管理均限于本线程,互不影响。

事件循环在多 Worker 环境中是完全隔离的——每个 Worker 拥有自己独立的事件循环,彼此不共享、不干扰。
各自运行独立的事件队列
主线程和每个 Worker 都维护一套完整的事件循环机制:有自己的任务队列(macro/micro task 队列)、自己的调用栈、自己的定时器队列。Worker A 中 settimeout 的回调不会影响 Worker B 的执行节奏,也不会插入到主线程的队列中。
- 主线程事件循环处理 DOM 渲染、用户交互、fetch 回调等
- Worker 内部事件循环只响应 postMessage 消息、内部 fetch、setTimeout/setInterval、以及它自己发起的 Promise 回调
- 即使两个 Worker 同时执行大量计算,它们的 microtask 清空顺序互不影响
通信必须通过异步消息传递
隔离性决定了线程间无法直接读写对方内存或变量,所有数据交换都依赖 postMessage —— 这个过程本质是把序列化后的数据副本推入目标线程的事件队列,由其事件循环后续取出并触发 onmessage。
- 传递 ArrayBuffer 时可使用 transferable 对象实现零拷贝,但所有权仍严格移交,原线程立刻失去访问权
- 不能在 Worker 中直接引用主线程创建的对象(如 Date 实例、普通 Object),否则会报错或得到空值
- 错误不会自动冒泡到其他线程;需在 Worker 内用 self.onerror 捕获,并主动通知主线程
定时器与 I/O 行为受本线程事件循环制约
每个 Worker 的 setTimeout/setInterval 精度只取决于自身事件循环是否被阻塞,与其他 Worker 或主线程无关。
- Worker 内执行一个耗时 200ms 的 for 循环,会导致它自己的定时器延迟,但不影响主线程渲染帧率或其他 Worker 的定时器
- fetch 请求在 Worker 内发起后,其响应回调进入该 Worker 自己的 microtask 队列,不会混入主线程的 Promise 处理流
- 未清理的 setInterval 会在对应 Worker 内持续占用内存和调度资源,不会“泄漏”到其他线程
资源释放需各自显式管理
事件循环隔离也意味着生命周期管理必须按线程粒度进行:一个 Worker 的 terminate 不会影响其他 Worker,主线程也无法替它关闭定时器或取消 fetch。
- Worker 完成任务后应调用 self.close() 或主线程调用 worker.terminate()
- 避免在 Worker 内长期持有大 ArrayBuffer 而不释放,虽不污染主线程,但会拖慢自身后续任务调度
- 主线程监听到 Worker 报错后,只能选择重启或忽略,无法介入其内部事件循环做干预











