首页 > 其他分享 >关于 Web Worker

关于 Web Worker

时间:2023-09-15 22:32:27浏览次数:43  
标签:Web DOM worker 主线 Worker 线程 关于

痛点

做为前端开发,最无奈的场景莫过于遇见“页面无响应”。背锅吧,不甘,不背锅吧,确实是自己负责的领域出现了问题。

而 Web Worker 的出现,可以在一定程度上缓解前端开发的无奈。

概念

Web Worker是HTML5的一项功能,它允许在后台线程中运行JavaScript代码,以便在主线程中执行其他任务,同时不影响用户界面的响应性。

使用Web Worker可以将耗时的计算、网络请求或其他耗资源的操作放在后台线程中运行,这样可以提高网页的性能和响应速度。主线程将专注于处理用户交互和渲染页面,而Web Worker负责处理复杂的计算任务。

Web Worker与主线程之间通过消息传递进行通信。主线程可以向Web Worker发送消息,并接收来自Web Worker的消息。这种通信是异步的,不会阻塞主线程的执行。

使用场景

Web Worker适用于那些需要在浏览器中执行耗时操作,但又不希望阻塞主线程的场景。它可以提高应用程序的性能和响应能力,同时保持用户界面的流畅性。

  1. 大量计算密集型任务:如果你需要在浏览器中进行大量的计算,可能会导致主线程阻塞。这时,可以使用Web Worker将这些计算任务转移到后台线程中处理,以确保用户界面的流畅性。
  2. 文件处理:如果你需要处理大型文件或执行复杂的文件操作,例如文件上传、压缩、解压缩等,Web Worker可以将这些操作转移到后台线程,以避免阻塞主线程。
  3. 数据处理和图形操作:如果你需要对大量数据进行排序、搜索、过滤等操作,或者执行复杂的图形操作,如图像处理、绘制等,Web Worker可以帮助你提高性能和响应速度。
  4. 异步请求和数据获取:如果你需要通过HTTP请求获取大量数据,或执行其他异步操作,如WebSocket通信、长轮询等,Web Worker可以在后台线程中处理这些操作,以免阻塞主线程。
  5. 实时通信和多线程协作:如果你需要进行实时通信,如聊天应用、多人游戏等,Web Worker可以帮助你处理网络通信和多线程协作,以提供更好的用户体验。

简单示例

下面是一个使用 Web Workers 实现多线程的示例:

  1. 创建一个 JavaScript 文件,命名为 worker.js,这是我们将在 Web Worker 中运行的代码。
javascript
// worker.js

// 在 Web Worker 中接收消息
self.onmessage = function(event) {
  var number = event.data;
  
  // 执行一些耗时的操作
  var result = calculateSquare(number);
  
  // 将结果发送回主线程
  self.postMessage(result);
};

// 一些耗时的操作
function calculateSquare(number) {
  var result = number * number;
  return result;
}
  1. 在主程序中创建一个新的 Web Worker 对象,并在其中加载 worker.js 文件。
javascript
// index.js

// 创建一个新的 Web Worker
var worker = new Worker('worker.js');

// 向 Web Worker 发送消息
worker.postMessage(5);

// 接收 Web Worker 的消息
worker.onmessage = function(event) {
  var result = event.data;
  console.log('计算结果为:', result);
};

在这个示例中,我们创建了一个 Web Worker 对象,并通过调用 worker.postMessage() 方法向其发送消息。Web Worker 对象中的代码在收到消息后执行一些耗时的操作,并将结果通过调用 self.postMessage() 方法发送回主线程。我们可以通过 worker.onmessage 监听消息来处理 Web Worker 的返回结果。

需要注意的是,由于 Web Workers 运行在独立的线程中,它们无法访问 DOM 元素和某些浏览器特定的 API。因此,在 Web Workers 中只能执行纯 JavaScript 代码,不能直接更新页面上的内容。

注意事项

在使用Web Worker时,有一些注意事项需要考虑:

  1. 跨域限制:Web Worker只能与加载它的网页处于同一域中。这是为了确保安全性,防止恶意代码窃取网页数据。如果需要在跨域页面中使用Web Worker,可以使用CORS(跨域资源共享)来解决。
  2. 文件路径:在创建Worker对象时,需要指定Worker脚本文件的路径。这个路径是相对于当前网页的。如果Worker脚本文件与网页处于同一目录下,可以直接使用文件名;否则,需要提供相对路径或绝对路径。
  3. 数据传递:Web Worker与主线程之间的通信是通过消息传递机制实现的。可以使用postMessage()方法将数据发送给Worker,并使用onmessage事件监听Worker返回的消息。在Worker中,可以使用self对象来发送消息,使用onmessage事件监听主线程发送的消息。
  4. 不可访问DOM:由于Web Worker运行在与主线程不同的线程中,所以它没有直接访问DOM的能力。这意味着无法在Worker中操作DOM元素,也无法使用document对象等。如果需要在Worker中处理需要DOM操作的逻辑,可以将结果通过消息传递给主线程,再由主线程进行DOM操作。
  5. 导入外部依赖:Web Worker默认只能使用自身的全局对象和内置对象,无法直接导入外部JavaScript文件。但是可以使用importScripts()方法导入外部脚本,以便在Worker中使用外部依赖。
  6. 长时间运行任务:Web Worker适合处理耗时的任务,但是长时间运行的任务可能会占用大量的CPU资源,甚至导致浏览器崩溃。因此,在设计时需要考虑任务的性质和用户体验。

总结起来,使用Web Worker时需要注意跨域限制、文件路径、数据传递、不可访问DOM、导入外部依赖和长时间运行任务等问题。了解这些注意事项,可以更好地应用Web Worker来提升网页性能和用户体验。

~

~

~

~ 本文完,感谢阅读!

~

~

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

大家好!我是编程三昧,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

标签:Web,DOM,worker,主线,Worker,线程,关于
From: https://blog.51cto.com/bianchengsanmei/7488256

相关文章

  • AHRS解算中关于磁强数据的处理
    问题描述AHRS众多算法中会将磁力计获取的三轴数据转换到导航坐标系(n),并将xoy平面的投影折算到x轴原因地磁场参考方向:地球的地磁场方向在地球表面上通常指向地理北极。因此,当计算物体的姿态时,需要考虑地磁场的方向,以便在导航坐标系中正确定位北方。正确对齐:将xoy平面上的磁力计......
  • 关于实现操作系统中一些操作的注意事项【随时更新】
    总结一些最近做MIT.S081OS遇到的一些问题1)在使用pipe时,应注意到对资源的释放问题,比如说在primes这个实验中遇到了当使用了pipe[1]对管道进行写入时,如果最后没有将pipe的写资源释放,可能导致资源持续被占用,进程无法正常结束的问题;附上sourcecode#include"kernel/sta......
  • 情感智商读书笔记2,关于移情
    移情其实就是共情,就是体会别人处境和感受的能力。在生活中,比如可以体会别人的悲伤、困境并感同深受。缺少移情能力,可能会没有融洽的人际关系,也可能增加犯罪率。为什么有的人移情能力高,有的人不足呢。有种说法是幼儿时期的照料者理论。如果一个小孩在幼儿时啼哭时,照顾的大人能够关注......
  • 关于Azure-4层-负载均衡器的-Inbound NAT rules-入站NAT规则-通信的数据包抓取-分析
    关于Azure-4层-负载均衡器的-InboundNATrules-入站NAT规则-通信的数据包-分析先说一下客户端-负载均衡器-真实的后端主机,环境信息如下:客户端的IP地址:192.168.20.4入站NAT前端IP:192.168.10.100后端服务器的IP :192.168.10.5+++++++++++++++++++++++++++++++++++++++++++......
  • 计算机网络散记 -- 关于局域网内两台设备互ping不了
    背景由于个人项目练习,所以固定两台设备的静态ip地址,window的ip地址为192.168.33.107,linux的ip地址为192.168.33.106。家里的wifi也有两个(其中一个为拓展器分发)【wifi名分别为“家用wifi”和“家用wifi-加强版”】。本来两台设备之间的通信是没问题的,就算切换了wifi,只要是同......
  • WebRTC C++ RTP over TCP配置
    前言RTPoverTCP这种情况,一般是WebRTCP2P打洞失败,才会选择WebRTC默认使用UDP传输,但是也可以通过TCP传输。使用TCP传输,需要服务器中转,turnserver,licode,janus之类的服务器解决方案搭建coTurn中转服务器https://blog.51cto.com/fengyuzaitu/7265986C++修改代码url后面必须指定?t......
  • vue页面集成海康威视web视频播放插件
    参考大神链接:https://www.jianshu.com/p/71d97362fdd81、进入海康威视官网下载web视频插件下载插件开发包:https://open.hikvision.com/download/5c67f1e2f05948198c909700?type=10 官方教程:https://open.hikvision.com/docs/docId?productId=612781c8ec4acb28e0e1c0c3&versi......
  • web 前端 tips:js 继承 —— 组合继承
    上篇文章给大家分享了js继承中的组合继承web前端tips:js继承——组合继承今天给大家分享一下js继承中的原型式继承原型式继承JavaScript的原型式继承是一种基于对象的继承方式,通过复制一个对象的属性和方法来创建一个新对象,并将原对象作为新对象的原型。这种继承方式可以......
  • Web阶段:第三章:JavaScript语言
    《JavaScript语言精粹》点击下载,密码:synuJavaScript介绍:1.Javascript语言诞生主要是完成页面的数据验证。2.它运行在客户端,需要运行浏览器来解析执行JavaScript代码。3.JS是Netscape网景公司的产品,最早取名为LiveScript;为了吸引更多java程序员。更名为javascript。4.JS是弱类型......
  • Web阶段:第四章:常用的正则表达式
    整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:”^[0-9]*$”只能输入n位的数字:”^\d{n}$”只能输入至少n位的数字:”^\d{n,}$”只能输入m~n位的数字:”^\d{m,n}$”只能输入零和非零开头的数字:”^(0|[1-9][0-9]*)$”。只能输入有两位小数的正实数:”^[0-9]+(.[0-9]{2})?$”。只能......