Web Workers是一种机制,通过它可以使一个脚本操作在与Web应用程序的主执行线程分离的后台线程中运行。这样做的优点是可以在单独的线程中执行繁琐的处理,让主(通常是UI)线程运行而不被阻塞/减慢。
Web Workers 概念与用法
一个 worker 是使用构造函数创建的一个对象(例如,Worker()
), 运行一个命名的 JavaScript文件 — 这个文件包含了将在 worker 线程中运行的代码,并且 worker 在与当前 window
不同的另一个全局上下文中运行。这个上下文由专用worker的情况下的一个DedicatedWorkerGlobalScope
对象表示(标准 workers 由单个脚本使用; 共享workers使用SharedWorkerGlobalScope
)。
你可以在你的 worker 线程中运行任意的代码,以下情况除外:你不能直接在 worker 线程中操纵 DOM 元素, 或者使用某些 window
对象中默认的方法和属性。 但是 window 对象中很多的方法和属性你是可以使用的,包括 WebSockets,以及诸如 IndexedDB 和 FireFox OS 中独有的 Data Store API 这一类数据存储机制。更多信息请参见: Functions and classes available to workers 。
主线程和 worker 线程之间通过这样的方式互相传输信息:两端都使用 postMessage()
方法来发送信息, 并且通过 onmessage
这个 event handler来接收信息。 (传递的信息包含在 Message
这个事件的数据属性内) 。数据的交互是通过传递副本,而不是直接共享数据。
一个 worker 可以生成另外的新的 worker,这些 worker 的宿主和它们父页面的宿主相同。 此外,worker 可以通过 XMLHttpRequest
来访问网络,只是 XMLHttpRequest
的 responseXML
和 channel
这两个属性将总是 null 。
除了专用 worker 之外,还有一些其他种类的 worker :
- 共享worker可被对多个脚本运行在不同的窗体,例如IFrames等, 只要这些workers处于同一域名。共享worker比专用worker稍微复杂一点 — 脚本必须通过活动端口进行通讯。详情请见
SharedWorker
。 - 服务器Worker一般作为web应用程序、浏览器和网络(如果可用)之前的代理服务器。他们旨在(除开其他方面)创建有效的离线体验,拦截网络请求,以及根据网络是否可用采取合适的行动并更新驻留在服务器上的资源。他们还将允许访问推送通知和后台同步API。
- Chrome Workers是一种仅适用于firefox的worker。如果您正在开发附加组件,希望在扩展程序中使用worker且有在你的worker中访问 js-ctypes的权限,你可以使用Chrome Workers。详情请见
ChromeWorker
- 音频 Workers可以在网络worker上下文中直接完成脚本化音频处理.
注意: 根据网络worker规范, worker错误时间不应该冒泡(参见bug 1188141)。该规范已在Firefox 42中实现。
Web Worker 接口
AbstractWorker
- 抽象属性和方法是所有类型的worker中常用的(例如
Worker
或SharedWorker
) Worker
- 表示正在运行的worker线程,允许你将信息传递到正在运行的worker程序代码。
SharedWorker
- 表示一种可以同时被多个浏览器环境访问的特殊类型的worker。这些浏览器环境可以是多个window, iframes 或者甚至是多个worker.
WorkerGlobalScope
- 表示任意worker的通用作用域(对于正常的网页类容来说与
Window
有相同的作用)。不同类型的worker都有从接口继承作用于对象,并且可以添加更多特定功能。 DedicatedWorkerGlobalScope
- 表示一个专用worker的作用域, 继承自
WorkerGlobalScope
,且可添加一些朱勇的功能。 SharedWorkerGlobalScope
- 表示一个共享worker的作用域, 继承自
WorkerGlobalScope
, 且可添加一些朱勇的功能。 WorkerNavigator
- 表示用户代理(客户端)的身份和状态。
示例
我们创建了几个简单的demos以演示基本用法:
你可以在使用web workers中找到有关这些demos是如何工作的更多信息。
规范
规范 | 状态 | 评论 |
---|---|---|
WHATWG HTML Living Standard | Living Standard | No change from Web Workers. |
Web Workers | Editor's Draft | Initial definition. |
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
Basic support | 4 | Unknown (3.5) | 10.0 | 10.6 | 4 |
Shared workers | 4 | 29 (29) | 未实现 | 10.6 | 4 |
Passing data using structured cloning | 13 | 8 (8) | 10.0 | 11.5 | 6 |
Passing data using transferable objects | 17 webkit 21 |
18 (18) | 未实现 | 15 | 6 |
Global URL |
10 as webkitURL 23 |
21 (21) | 11 | 15 | 6 as webkitURL |
Feature | Android | Chrome Mobile | Firefox Mobile (Gecko) | Firefox OS (Gecko) | IE Phone | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|---|
Basic support | 4.4 | 4 | 3.5 | 1.0.1 | 10.0 | 11.5 | 5.1 |
Shared workers | — | 4 | 29 | 1.4 | 未实现 | — | — |
Passing data using structured cloning | — | 4 | 8 | 1.0.1 | 未实现 | — | — |
Passing data using transferable objects | — | — | 18 | 1.0.1 | 未实现 | — | — |
相关链接
- Using Web Workers
- Worker Interface
- SharedWorker interface
- ServiceWorker API
- Functions and classes available to workers
- Advanced concepts and examples
- ChromeWorker: for using workers in privileged/chrome code