前端培训-中级阶段(24)- Web Workers多线程(2019-11-7期)

简介: 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。JS 是单线程,事件循环模型。使用上来说如果有大量、高强度的计算会导致 UI渲染进程卡顿。按照 FPS: 60 来计算 1000ms/60 = 16.666ms。我们一段程序的占用时间需要低于16.666ms。

Web Workers 用法



new Worker(url),将会在 worker 线程中运行代码,该环境与主线程不同。


因为并不是浏览器环境,所以 DOM、window 是无法使用的。当然也有一些API可以使用 localstroage、websocket、indexDB、XMLHttpRequest 等是没问题的。


同时分为两种环境。


  1. 独享模式:DedicatedWorkerGlobalScope (一个专用线程对应一个主线程)


  1. 共享模式:SharedWorkerGlobalScope(一个共享线程对应多个主线程)


主线程和 worker线程 之间使用 postMessage() 方法来发送信息,通过 onmessage 这个事件监听来接收信息。


数据的传输方式为传递副本,而不是直接共享数据。所以也导致有时传递的损耗高于计算的损耗。


当然,也支持整体内存移交给 worker,不过这样使用的话,主线程就访问不了这块内容了。


测试地址


worker


独享线程(Dedicated Web Worker),只能由创建时的主线程使用。


//html
wk = new Worker('/static/workers/1190000020913212.js');
demo2.addEventListener('click', function(){
    wk.postMessage(str)
})
//1190000020913212.js
onmessage = function(e) {
    var str = e.data;
    console.time('reportString');
    console.log(str.length, str.split('').join('+').length)
    console.timeEnd('reportString');
}


Shared Worker



同域被多个窗口 多个脚本运行时,可以用于通信。


比如 iframe、标签页。


// html
swkPIP = new SharedWorker('/static/workers/1190000020913212-SharedWorker-pip.js');
swkPIP.port.start();
swkPIP.port.postMessage(args)
// worker.js
var portArr = [];
onconnect = function(e) {
    var port = e.ports[0];
    portArr.push(port)
    port.addEventListener('message', function(e) {
      console.log(self, e, port)
      if(e.data.type == 'private'){
          port.postMessage(['pip', e.data]);    
      }else if(e.data.type == 'public'){
          portArr.forEach(v=>v.postMessage(['pip', e.data]))
      }else if(e.data.type == 'publicNoSelf'){
          portArr.forEach(v=>v!=port&&v.postMessage(['pip', e.data]))
      }
    });
    port.start(); // Required when using addEventListener. Otherwise called implicitly by onmessage setter.
}


从实现代码中可以看到。


Shared Worker 需要使用 prot 通道。还需要 start() 开启通道。


可以实现的效果


  1. 跨窗口通信


  1. 比如说有一些轮询的接口,在多窗口的场景中会形成密集的访问。如果我们把请求转入Shared Worker,Shared Worker中做节流。拉回数据再通知各个窗口。


  1. 比如用户在一个窗口中登录,把登录状态通知给其他窗口。


Service Workers



用于浏览器到服务器之前的代理服务。可以实现离线访问、拦截请求、更新缓存等。

navigator.serviceWorker.register('/static/js/sw-20190621.js')


其他事项



通过URL.createObjectURL()创建URL对象,可以实现创建内嵌的worker


开启worker需要一个同源的URL。有时我们也不需要一个这样的文件,那么我们就可以通过一个指向内存的URL。


// worker.js
var str = `
    var i = 0;
    function test(){
        postMessage(++i);
        setTimeout(test, 1000);
    }
    test();
`;
// html
var blob = new Blob([str]);
var wk = new Worker(window.URL.createObjectURL(blob));


通过转让对象来传递数据


默认情况下,主线程与 worker 之前的数据传递是通过拷贝,也就是JSON.stringify()之后再发送,接受使用JSON.parse()处理。


这样使用起来在会损耗一部分在序列化与反序列化中。


所以 worker 给我们提供了一种更高效的方式,将整块数据传入(整块内存移交,再源环境将不可访问)。


myWorker.postMessage(uInt8Array, [uInt8Array]);


通过postMessage的第二个入参,我们把uInt8Array对象整个发送出去。


执行环境的上下文


我们都知道 浏览器环境的上下文和Node环境的上下文是不一样的,其中有一些是浏览器环境中独有的。worker环境也是不一样。


其中 self 指向当前环境的 global,与 Window 不是同一个对象,而是 WorkerGlobalScope

相关文章
|
18天前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
31 3
|
15天前
|
监控 前端开发 JavaScript
探索微前端架构:构建可扩展的现代Web应用
【10月更文挑战第29天】本文探讨了微前端架构的核心概念、优势及实施策略,通过将大型前端应用拆分为多个独立的微应用,提高开发效率、增强可维护性,并支持灵活的技术选型。实际案例包括Spotify和Zalando的成功应用。
|
19天前
|
前端开发 JavaScript
Bootstrap Web 前端 UI 框架
Bootstrap 是快速开发 Web 应用程序的前端工具包。
30 3
|
19天前
|
前端开发 安全 应用服务中间件
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第26天】随着互联网的快速发展,前端性能调优成为开发者的重要任务。本文探讨了HTTP/2与HTTPS在前端性能优化中的应用,介绍了二进制分帧、多路复用和服务器推送等特性,并通过Nginx配置示例展示了如何启用HTTP/2和HTTPS,以提升Web应用的性能和安全性。
17 3
|
19天前
|
前端开发 JavaScript API
前端框架新探索:Svelte在构建高性能Web应用中的优势
【10月更文挑战第26天】近年来,前端技术飞速发展,Svelte凭借独特的编译时优化和简洁的API设计,成为构建高性能Web应用的优选。本文介绍Svelte的特点和优势,包括编译而非虚拟DOM、组件化开发、状态管理及响应式更新机制,并通过示例代码展示其使用方法。
33 2
|
20天前
|
开发框架 前端开发 JavaScript
Web前端框架
Web前端框架等名词
16 2
|
30天前
|
人工智能 前端开发
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
|
1月前
|
存储 前端开发 JavaScript
从 Web 2.0 到 Web 3.0:前端开发的历史与未来
【10月更文挑战第4天】本文探讨了从 Web 2.0 到 Web 3.0 的前端开发演变过程。Web 2.0 时代,前端开发者从静态网页设计走向复杂交互,技术框架如 jQuery、React 和 Vue 带来了巨大的变革。而 Web 3.0 以区块链技术为核心,带来了去中心化的互联网体验,前端开发者面临与区块链交互、去中心化身份验证、分布式存储等新挑战。文章总结了 Web 2.0 和 Web 3.0 的核心区别,并为开发者提供了如何应对新技术的建议,帮助他们在新时代中掌握技能、设计更安全的用户体验。
53 0
从 Web 2.0 到 Web 3.0:前端开发的历史与未来
|
20天前
|
监控 前端开发 JavaScript
前端技术探索:构建高效、可维护的Web应用
【10月更文挑战第23天】前端技术探索:构建高效、可维护的Web应用
37 0
|
1月前
|
移动开发 前端开发 JavaScript
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
155 0