什麽是Web Worker? 它可以做什麽?在了解Web Worker前,可能需要先知道:网页中 Javascript
因为Javascript是一个单执行绪(single thread)的程序语言。
学术一点的说法:是只有一个主执行绪的程序;
简单的来说:一次只能执行一个指令;
生活一点来说:
你专心写程序不做其他事 --> 单执行绪
你边写程序边听音乐还边唱歌 --> 多执行绪
由於「单执行绪」的程序语言特质,加上「前端(逻辑处理+画面渲染)处理量日渐提升」,让Javascript在效能面有时会面临困境。而Web Worker就是解决这样的困境的方法之一。
Web Worker 是 HTML5 中提出的概念。
Web Workers makes it possible to run a script operation in a background thread separate from the main execution thread of a web application.
Web Worker替 JavaScript 创造多执行绪环境,允许主执行绪建立 Worker 执行绪,将一些任务分配给後者执行。
用一个简单的例子来说明一下有没有Web Worker之间的差异,比方我今天要制作珍珠奶茶和巧克力松饼:
在只有单执行绪的Javascript里,我就需要先准备好我的data(麦香奶茶),然後开始将资料做一些处理dowork(data),像是加入珍珠和冰块并把奶茶倒入,这类复杂的运算;做完之後再把处理过後的data拿出来使用useData(ProcessData),把一整桶座好的珍珠奶茶装成一杯;再继续做下一个任务制作巧克力松饼。一件事情做完,再往下一件事做,就是原本Javascript的执行方式。
而加入Web Worker之後:
多了一个Worker执行绪,可以帮忙分担工作,因此会让Worker执行绪分担一点复杂的工作(会花一点时间),而主执行绪可以继续执行其他事情。同时进行就可以加快执行速度。如上图所示,准备好麦香奶茶後(data),我们把复杂的加冰块、到奶茶、加珍珠的制作过程销给Worker执行绪处理,而Worker执行绪再把处理後的资料(珍珠奶茶)传回给主执行绪使用。在Worker执行绪制作珍珠奶茶的过程中,主执行绪可以进到下一个任务做巧克力松饼。因此整体完成的时间就可以比较快速!
简而言之,Web Worker 就是多一个人帮忙分担你要做的事,但这个人什麽都可以做吗?有这麽好的事???
当然没这个好康啦,请人帮忙还是要有点限制的,这边我们就来看一下Web Worker的使用范围和限制
知道了Web Worker的使用范围,那我们到底可以请他帮什麽忙?
再开始说明情境前,我们在复习一下,Web Worker的特型:
- 多执行绪
- 与主执行绪独立,不影响主执行绪运行
因此,我们大概可以归纳出两种情境
多任务串型转成并行:顺序的任务,转为并行,任务之间必须没有依赖关系,
但是要注意多任务调度的调配需要考虑
大量运算任务避免在主执行绪中执行,复杂运算移到 Web Worker
customize.js (主执行绪程序)
2-1. 检查是否支援web worker,若有的话便建立一个worker执行绪
2-2. 透过PostMessage传送资料给worker执行绪,onmessage 接收worker执行绪处理好的资料
透过onmessage 收主执行绪传来的资料,PostMessage传送处理好的资料
再将HTML加上所需的画面,就可以达到引用Web Worker的效果
程序sample 下载 https://ppt.cc/fhmopx
使用Web Worker真的都变快吗?简单的运算和少量的运算如果加上两执行序的沟通成本,那不如就是主执行绪自己制作就可以了。
由於主执行绪与Worker执行绪之间的沟通需要靠PostMessage(如下图所示)
若PostMessage的发送接收时间较长,依然会造成卡顿,那怎样的情况会造成发送接收时间较长?其实有数据显示
当传输量特别大的时候,PostMessage 可能会造成卡顿的情况,不同平台,造成卡顿的传输量上限也不同
当任务分配给两边一定会多了一些会出错的可能性,要注意的可能包含像:失败处理、超时处理或冲突处理等等
其实Web Worker还可以再仔细区分为两种:「专用执行绪」和「共享执行绪」
目前约有 97.06% 的浏览器支援专用执行绪
共享执行绪,则仅有大约 38.09% 的浏览器支援
好了,这就是简单的Web Worker入门分享啦~~~
<<: [Day27 ] Chained Exploits - 链式漏洞利用(漏洞利用组合技)
前言 GPU卡原来是针对游戏开发及显示加速的设计的,後来才扩散至挖矿、深度学习...等其他领域,而游...
前一篇提到了Build pipeline的排程除了可以在Yaml内设定之外,也可以透过传统UI的方式...
多张照片混合 教学原文参考:多张照片混合 这篇文章会介绍使用 GIMP,的图层,搭配混合模式、渐层色...
经历了前两天的介绍及环境准备後,我相信大家大概都已经准备好要开始进入Django的世界了吧! 什麽?...
上一篇讲完如何处理已经得到的资讯数据,今天来看看我们是如何与Web 服务器进行通信的 首先添加依赖:...