黄子涵

第18章 Web Workers

18.1 Web Workers概要

18.1.1 Web Workers 的定义

从内部来看,客户端 JavaScript 与 UI 的渲染处理用的是同一个进程,而且是以单线程的方式执行的。因此,如果在客户端 JavaScript 中执行高负载的处理,就可能会发生 UI 渲染处理被阻断这一致命问题。

Web Workers 是一种能够在另外的线程中创建新的 JavaScript 运行环境,以使 JavaScript 代码能够在后台处理的一种机制。如果能够视情况恰当地分离出复杂的处理,并将其置于后台运行,就能够在通过客户端进行复杂处理的同时,不妨碍用户的 UI 操作,从而开发出高可用性的 Web 应用程序。

18.1.2 Web Workers 的执行方式

通常的客户端 JavaScript 运行环境称作主线程,而将通过 Web Workers 创建的后台 JavaScript 运行环境称为工作线程(Worker)。可以在主线程中创建工作线程,且能够同时创建多个工作线程。

主线程与工作线程的 JavaScript 运行环境是相互分离的,无法相互引用对方环境中的变量。也就是说,在各自的环境中分别准备了其全局对象,且这些全局对象无法被相互引用。可以通过 window 这一名称来引用主线程的全局对象,并通过 self 这一名称来引用工作线程的全局对象。

还有一个重要的问题是,从工作线程的环境中是无法引用 document 对象的。也就是说,所有的 UI 操作,即 DOM 的引用与更改,都只能在主线程中进行。无法在工作线程中对 UI 进行任何操作。如果要进行数据的收发处理,则必须通过消息收发接口(postMessage 方法、message 事件)来进行。

这些都是为了简化多线程程序设计而添加的限制。在语言规范层面上保证了 UI 操作始终都只能在主线程中执行的话,就能够将一些在多线程程序设计中多发的错误防范于未然。

主线程、工作线程与 DOM 的关系图

image

18.2 基本操作

18.3 Web Worker实践

18.4 共享工作线程

posted @ 2022-04-29 21:32  黄子涵  阅读(202)  评论(0编辑  收藏  举报