PWA(Progressive Web App)入门系列:(五)Web Worker

前言

在说Service Worker前有必要说一下Web Worker,因为Service Worker本身就属于Web Worker的延伸,大部分功能也是基于Web Worker进行的扩展。

背景

众所周知,JavaScript引擎是以单线程调度的方式进行,我们无法同时运行多个JavaScript文件,这种情况下就会导致对硬件资源无法充分利用,并且当在进行一些高耗性能的操作时,会影响主线程的其他任务,造成任务阻塞及用户体验差等问题。

在这种劣势情况下,到 2008 年 W3C 提出第一个 HTML5 草案开始,就在 HTML5 中提出了Web Worker的概念,并规范了Web Worker的三大特征:

  • 能够长时间运行
  • 理想的启动性能
  • 理想的内存消耗

简介

Web Worker 是HTML5标准的一部分,这一规范定义了一套 API。实现了 用Web Worker 来实现 JavaScript 的 “多线程” 技术,并发执行多个 JavaScript 脚本。

Web Worker 与传统多线程

每个JavaScript脚本执行流都称为一个线程,彼此之间互相独立,并且有浏览器中的 JavaScript 引擎负责管理,当然这并不是说JavaScript支持多线程,虽然传统JavaSript有多种方式实现了对多线程的模拟(例如:setinterval,setTimeout,以及一些异步的操作方法等),但是在本质上程序的运行仍然是由 JavaScript 引擎以单线程调度的方式运行的,而Web Worker的线程是依赖于浏览器(宿主环境)来实现的,从而实现了对浏览器端多线程编程的支持。

Web Worker 线程种类

Web Worker 有两种不同线程类型,分别是:

  • Dedicated Worker (专用线程)。只能被首次生成它的脚本使用
  • Shared Worker (共享线程)。可以同时被多个脚本使用

通常来说的Web Worker指的就是Dedicated Worker,Service Worker也属于其中,并且各大浏览器对其支持良好,而Shared Worker指的是SharedWorker,目前各大浏览器对其支持度较差。

这里主要对Dedicated Worker进行详细说明,对于Shared Worker不再进行细说。

Worker模式



Worker线程执行流



创建 Web Worker

下面说一下如何创建一个Web Worker

语法:

new Worker(in DOMString aStringURL
);

使用上面的方式即可以创建一个Web Worker对象,它执行的是aStringURL中的脚本。目前大多数浏览器是支持data URI的aStringURL的,可以通过URL.createObjectURL(blob)创建。但需要注意的是脚本必须遵循同源策略。

下面创建一个Worker,Worker的执行脚本是workerfile.js,创建成功后,它会返回一个新的Worker对象赋值给前面声明的workerObj变量

var workerObj = new Worker('./workerfile.js');

这里需要注意, worker线程的创建的是异步的,主线程代码不会阻塞在这里去等待worker线程去加载、执行相应的脚本文件,而是会立即向下执行后面代码。

Web Worker实例方法

Worker的实例方法只有两个:

  • postMessage
  • terminate

postMessage

主线程向生成的Worker线程发送数据的方法。

语法:

workerObj.postMessage(aMessage, transferList);
  • aMessage:向Worker线程发送的消息数据对象。它可以是任何类型的值或JavaScript对象。
  • transferList:可选。Transferable类型的数组。主要用在 ArrayBuffer, MessagePort, ImageBitmap对象。

注意:

postMessage发送的aMessage参数,在传递通讯的时候会对数据进行克隆,为了防止多个线程间的数据同时修改的问题。实际上,浏览器内部的实现是,先将通信传递的数据串行化,随后把串行化后的数据发给子线程,后者再将数据还原。

postMessage也可以以二进制的方式传输,例如 ArrayBuffer 、File、Blob、ImageBitmap等对象。但是往往传输的这些对象数据量都很大,前面说了传输数据会进行拷贝,如果传一个100MB的数据,那么浏览器默认会再复制一份100MB的数据,导致一些不必要的资源消耗。为了防止这种问题,就可以使用上面说的第二个参数transferList来解决。

顺道科普一下Transferable接口。这个接口代表一个能在不同可执行上下文中相互传递的对象,例如主线程和Worker线程。

var arrBuff = new ArrayBuffer(8);
myWorker.postMessage(arrBuff, [arrBuff]);

terminate

语法:

workerObj.terminate()

用于立即终止worker对象的行为,如果worker正在运行着任务也会立即终止。

Web Worker实例属性

Worker实例包含两个属性:

  • onmessage:用来接收worker线程传递过来的数据事件。
  • onerror:用来接收worker线程的错误信息。

onmessage

onmessage属性表示一个EventHandler事件处理函数,当Worker子线程返回一条消息时被调用。

语法:

workerObj.onmessage = function(e) { ... 
}

传递来的消息被封装在事件的data属性中。

workerObj.onmessage = function(e) {var result = e.data;
}

onerror

onerror属性是EventListener 一个事件监听函数,一旦有类型为 error 的 ErrorEvent 从 worker线程中冒泡出来时就会执行该函数。可以通过preventDefault()来取消冒泡。

主要用到的错误属性有:

  • message: 可读的错误信息
  • filename: 发生错误的脚本文件名称
  • lineno: 发生错误的脚本所在文件的行数

Web Worker文件方法

Worker线程对象抽象于DedicatedWorkerGlobalScope接口。此作用域下没有window对象,需要用self来调用。

在发送数据和接收数据使用的方法和worker实例对象的一样:

  • postMessage
  • onerror

这两个方法就不说了,还有一个close方法说一下。

close

这个和terminate()有点类似。这个方法主要用来清除所有在WorkerGlobalScope事件环中的排队任务,关闭特定作用域。

self.close()

importScripts 导入脚本

WorkerGlobalScope 对象中可以使用importScripts()方法来进行对脚本文件和资源的引入。

但这个操作需要注意:

  • 如果没有给 importScripts 方法任何参数,那么立即返回,终止下面的步骤。
  • 解析 importScripts 方法的每一个参数。
  • 如果有任何失败或者错误,抛出 SYNTAX_ERR 异常。
  • 尝试从用户提供的 URL 资源位置处获取脚本资源。
  • 对于 importScripts 方法的每一个参数,按照用户的提供顺序,获取脚本资源后继续进行其它操作。

Worker线程声明周期

worker线程间的数据传递必须依赖于浏览器的context环境,通过MessagePort进行传递数据,所以每个worker线程的全局作用域都会有端口列表,并且会在WorkerGlobalScope中生成一个worker线程的线程列表,在初始化时为空。当worker线程创建时会被填充进去,当worker线程终止时会从这个列表删除。

worker线程中可调用的对象

在worker线程中,可以获得下列对象:

  • navigator
  • location
  • XMLHttpRequest
  • setTimeout/setInterval
  • Application Cache
  • fetch
  • atob/btoa

等等。

实例

下面写一个使用的小例子

html文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
</head>
<body>
<button id="btn">发送</button>
<script>var worker = new Worker('./worker.js')btn.onclick = function(){worker.postMessage({a:1,b:2,c:3})}worker.onmessage = function(e){console.log('index-msg:', e)}worker.onerror = function(e) {console.log('index-err', e)e.preventDefault()}
</script>   
</body>
</html>

worker.js文件

self.onmessage = function(e) {console.log('worker in:', e)self.postMessage('get postMessage!')
}

兼容性

还是有必要列一下Worker目前在浏览器上的兼容性:



可以看到支持的非常不错。

总结

可以看到Web Worker的出现使得在 Web 进行多线程编程成为可能,对于高消耗、耗时长的操作可以放到woker里面去进行。

所以可以在以下应用场景使用:

  • 使用专用线程进行数学运算
  • 图像处理
  • 大量数据的检索
  • 背景数据分析

等。


博客名称:王乐平博客

CSDN博客地址:http://blog.csdn.net/lecepin

知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Glob Patterns匹配模式使用

前段时间在用workbox时&#xff0c;在做precache时&#xff0c;匹配模式基于的是Glob Pattern模式&#xff0c;于是就看了下相关文档。 下面翻译一下node-glob的使用&#xff0c;原文&#xff1a;https://github.com/isaacs/node-glob#glob-primer Glob 像在shell里面&#x…

Workbox CLI v3.x 中文版

在写PWA应用时&#xff0c;用到WorkBox工具&#xff0c;使用过程中发现没有中文的帮助文档&#xff0c;为了体验好一些&#xff0c;也为了方便自己和他人查看&#xff0c;在这里翻译了一下workbox-cli。 Workbox CLI 是什么? Workbox命令行&#xff08;在workbox-cli包内&…

Workbox.routing v3.x 中文版

NAMESPACE STATIC VERSION V3.6.1 类 NavigationRoute NavigationRoute可以轻松创建匹配浏览器navigation requests的Route。 它仅匹配mode设置为navigate的请求。 您可以只使用blacklist和whitelist参数中的一个或两个&#xff0c;将此路由应用于导航请求中。 RegExpRout…

Workbox.strategies v3.x 中文版

NAMESPACE STATIC VERSION V3.6.1 该模块提供了大多数serviceworker常用的缓存策略的简单实现。 类 CacheFirst cache-first请求策略的实现。 缓存优先策略对于带版本号的资源是非常有用的&#xff0c;像这种URLstyles/example.a8f5f1.css&#xff0c;因为它们可以长时间缓存…

集算器访问HTTP数据的代码示例

使用集算器&#xff08;esProc&#xff09;可以很方便的从http数据源读取数据进行处理。本例子中有一个servlet&#xff0c;对外提供json格式的雇员信息查询。Servlet访问数据库的员工表&#xff0c;保存了员工的信息&#xff0c;如下&#xff1a;EID NAME SURNAME …

PWA(Progressive Web App)入门系列:Cache Storage Cache

前言 目前浏览器的存储机制有很多&#xff0c;如&#xff1a;indexedDB、localStorage、sessionStorage、File System API、applicationCache 等等&#xff0c;那为什么又制定了一套 Cache API 呢&#xff1f;对比其他存储机制有什么优势&#xff1f; 简介 Cache API 是一套…

「浏览器插件」无广告国内视频平台直接播放插件

前段时间发现一些比较不错的解析国内视频平台的一些 API 接口&#xff0c;很早之前基于这些接口做过一个 Android 端的播放软件&#xff0c;但为了更方便使用吧&#xff0c;于是做了一个 Chrome 的浏览器插件&#xff0c;解析接口也是在线更新的&#xff0c;所以用起来会比较方…

kafka性能测试(转)KAFKA 0.8 PRODUCER PERFORMANCE

来自:http://blog.liveramp.com/2013/04/08/kafka-0-8-producer-performance-2/ At LiveRamp, we constantly face scaling challenges as the volume of data that our infrastructure must deal with continues to grow. One such challenge involves the logging system. At…

Workbox-Window v4.x 中文版

Workbox 目前发了一个大版本&#xff0c;从 v3.x 到了 v4.x&#xff0c;变化有挺大的&#xff0c;下面是在 window 环境下的模块。 什么是 workbox-window? workbox-window 包是一组模块&#xff0c;用于在 window 上下文中运行&#xff0c;也就是说&#xff0c;在你的网页内…

媒体播放器三大底层架构

2019独角兽企业重金招聘Python工程师标准>>> 媒体播放工具&#xff0c;这里主要指视频播放&#xff0c;因为要面临庞大的兼容性和纷繁复杂的算法&#xff0c;从架构上看&#xff0c;能脱颖而出的体系屈指可数。大体来说业界主要有3大架构&#xff1a;MPC、MPlayer和…

PWA 可用性检测工具

针对移动端或者 PC 端浏览器是否对 PWA 可用的问题上&#xff0c;做了一个简单的站点&#xff0c;来实现上述问题的方便检测。让开发者较快的了解终端浏览器的特性支持度。 使用 工具地址&#xff1a;https://lecepin.gitee.io/detect-sw/ 地址二维码&#xff1a; 检测 可…

PWA 应用列表及常用工具

引言 在做 PWA 的过程中自己写了一些相关的应用和工具&#xff0c;在这里整合下&#xff0c;方便记录及查找使用。 应用列表 PWA 支持检测工具番茄钟二维码生成新闻应用身体数据统计应用支付宝集福应用田英章书法字典应用抖音无水印下载应用很好用的备忘录精神氮泵 PWA 支持检…

Struts2中访问HttpServletRequest和HttpSession

2019独角兽企业重金招聘Python工程师标准>>> 关键字: struts2 httpservletrequest httpsession 在没有使用Struts2之前,都习惯使用HttpServletRequest和HttpSession对象来操作相关参数,下面介绍一下在Struts2中访问隐藏的HttpServletRequest和HttpSession的两种方法…

web前端长度单位详解(px、em、rem、%、vw/vh、vmin/vmax、vm、calc())

基础理论1&#xff09;简介2&#xff09;绝对长度3&#xff09;相对长度4&#xff09;经验之谈1&#xff09;简介 在前端开发中&#xff0c;会遇到各种不同类型的长度单位&#xff0c;比如px,em,rem等。 而整体的长度单位分为两大类&#xff1a;相对长度 和 绝对长度。 2&…

PWA(Progressive Web App)入门系列:Fetch Request Headers Response Body

前言 在 WEB 中&#xff0c;对于网络请求一直使用的是 XMLHttpRequest API 来处理&#xff0c;XMLHttpRequest 也很强大&#xff0c;传统的 Ajax 也是基于此 API 的。那么为什么 W3C 标准中又加入了类似功能的 Fetch API 呢&#xff1f;他有何优势。 Fetch 什么是 Fetch Fet…

CSS3开发总结(圆角、盒阴影、边界图片)

CSS3开发总结&#xff08;圆角&#xff09; 12/100 发布文章 qq_41913971 CSS31&#xff09;圆角 border-radius2&#xff09;盒阴影 box-shadow3&#xff09;边界图片 border-image-source1&#xff09;圆角 border-radius border-radius属性&#xff0c;复合属性。一个最多可…

深入理解Android的startservice和bindservice

一、首先&#xff0c;让我们确认下什么是service&#xff1f; service就是android系统中的服务&#xff0c;它有这么几个特点&#xff1a;它无法与用户直接进行交互、它必须由用户或者其他程序显式的启动、它的优先级比较高&#xff0c; 它比处于前台的应用优先级低&am…

PWA(Progressive Web App)入门系列:Notification

前言 在很多场景下&#xff0c;需要一种通知的交互方式来提醒用户&#xff0c;传统方式下可以在页面实现一个 Dialog&#xff0c;或通过修改网页的 title 来实现消息的通知。然而传统的实现存在着一定的不足&#xff0c;在网页最小化的情况下&#xff0c;无法查看任何通知&…

PWA(Progressive Web App)入门系列:Push

前言 很多时候&#xff0c;原生应用会通过一些消息推送来唤起用户的关注&#xff0c;增加驻留率。网页该怎么做呢&#xff1f;有没有类似原生应用的推送机制&#xff1f;推送功能又能玩出什么花样呢&#xff1f; Push API Push API 给与了 Web 应用程序接收从服务器发出的推送…

Dom学习笔记

DOM document object model 文档 对象 模型 文档&#xff1a;html页面 文档对象&#xff1a;页面中的元素 文档对象模型: 文档对象模型是w3c 为了能够让js去操作页面中的元素&#xff0c;定义的一套标准 DOM会把当前文档看作一棵树 树种的每一个元素就是文档树 的一个节点 同…