菜单

Web Workers

相关源文件

本文档介绍了 Deno 的 Web Worker 实现,包括 worker 的创建、消息传递、隔离机制以及通过 worker_threads 实现的 Node.js 兼容性。Web Worker 提供了一种在并行线程中运行 JavaScript 代码并通过结构化通信通道进行交互的方式。

有关更广泛的运行时架构信息,请参阅 运行时架构。有关权限和安全性的详细信息,请参阅 权限系统

架构概述

Deno 的 Web Worker 实现由多个层组成,这些层协同工作,提供具有结构化通信的隔离 JavaScript 执行上下文。

核心 Web Worker 架构

Worker 创建和管理流程

来源:runtime/ops/worker_host.rs44-260 runtime/js/11_workers.js80-138 ext/web/13_message_port.js50-88

Worker 创建过程

Worker 创建过程涉及从 JavaScript API 调用到线程启动的多个步骤。

Worker 创建组件

组件位置目的
Workerruntime/js/11_workers.js80-310用于 worker 创建的 JavaScript API
op_create_workerruntime/ops/worker_host.rs144-260用于启动 worker 的 Rust 操作
CreateWebWorkerArgsruntime/ops/worker_host.rs35-44Worker 创建参数
WorkersTableruntime/ops/worker_host.rs85活动 worker 管理

Worker 初始化顺序

Worker 创建过程同时处理经典的 (importScripts) 和模块 worker,具有不同的初始化路径。

  • 模块 Worker:直接使用 import 加载 ES 模块。
  • 经典 Worker:使用 importScripts("#") 占位符和同步 fetch 来加载脚本。

来源:runtime/ops/worker_host.rs144-260 runtime/js/11_workers.js94-138 runtime/ops/web_worker/sync_fetch.rs85-200

消息传递系统

Web Workers 通过基于 MessagePort 通道的结构化消息传递系统进行通信。

Message Port 架构

消息序列化过程

消息传递系统支持结构化克隆和可转移对象。

消息类型处理位置
结构化数据core.serialize() / core.deserialize()ext/web/13_message_port.js436-438
MessagePorts在上下文之间转移所有权ext/web/13_message_port.js446-459
ArrayBuffers分离并转移 buffer 所有权ext/web/13_message_port.js460-468

来源:ext/web/13_message_port.js406-475 ext/web/message_port.rs54-101 runtime/ops/web_worker.rs31-54

Worker 类型与隔离

Deno 支持两种类型的 Web Workers,具有不同的执行模型。

Worker 类型比较

功能模块 Worker经典 Worker
模块系统ES 模块 (import)importScripts()
脚本加载异步模块解析通过 op_worker_sync_fetch 进行同步 fetch
权限继承或受限继承或受限
JavaScript 上下文现代 ES 环境兼容旧版的环境

Worker 隔离模型

每个 worker 都在一个单独的线程中运行,并具有:

  • 隔离的 JavaScript 上下文:没有共享的全局状态。
  • 权限继承:Worker 可以拥有父级权限的子集。
  • 独立的事件循环:独立处理异步操作。
  • 结构化通信:仅通过消息传递。

来源:runtime/ops/worker_host.rs172-181 runtime/permissions.rs1-198 runtime/js/11_workers.js94-138

控制和错误处理

Workers 拥有一个双通道通信系统,用于消息和控制事件。

控制事件类型

控制系统通过以下方式管理 worker 的生命周期:

  • 错误传播:Worker 错误会以 ErrorEvent 的形式冒泡到宿主。
  • 优雅关闭:Workers 通过 close 事件发出完成信号。
  • 终止:宿主可以强制终止 worker。
  • 资源清理:自动清理 worker 资源。

来源:runtime/js/11_workers.js185-218 runtime/ops/worker_host.rs312-352 runtime/js/11_workers.js164-183

Node.js 兼容性

Deno 通过 polyfills 提供 Node.js worker_threads 兼容性。

Node.js Worker Threads API

API实现目的
Workerext/node/polyfills/worker_threads.ts91-330Node.js 兼容的 worker 创建
parentPortext/node/polyfills/worker_threads.ts360-471Worker 与父级之间的通信
workerDataext/node/polyfills/worker_threads.ts336-400传递给worker的初始数据
MessageChannelext/node/polyfills/worker_threads.ts514-523Node.js 风格的消息通道

Node.js 与 Web Workers 的区别

Node.js 兼容层将 Web Workers 适配为匹配 Node.js API

  • 事件模型:将 DOM 事件转换为 EventEmitter 模式
  • API 表面:提供 Node.js 特有的属性,例如 threadIdresourceLimits
  • Worker 数据:通过 workerData 属性处理初始数据传递
  • 模块加载:支持 CommonJS 和 ES 模块

来源: ext/node/polyfills/worker_threads.ts91-660 tests/unit_node/worker_threads_test.ts24-433