Web Worker的概念、用法、使用场景

news2024/12/23 2:27:02

目录

1. 简介

2. 适用场景

2.1 复杂计算

2.2 后台下载

2.3 数据处理

2.4 实时通信

3. 代码示例

3.1 Worker特性检测

3.2 Worker API

3.3 SharedWorker API

3.4 创建 JavaScript 文件

3.5 创建 Web Worker

4. 总结


1. 简介

Web Worker 使得在一个独立于 Web 应用程序主执行线程的后台线程中运行脚本操作成为可能。这样做的好处是可以在独立线程中执行费时的处理任务,使主线程(通常是 UI 线程)的运行不会被阻塞/放慢。

2. 适用场景

2.1 复杂计算

当涉及到大量计算或复杂的数据处理时,可以将这些操作放在 Web Worker 中进行,避免阻塞主线程。例如,图像处理、音频处理、视频处理等。

2.2 后台下载

当需要下载大量数据时,可以使用 Web Worker 在后台进行数据的下载和处理,以避免阻塞用户界面。例如,从服务器获取大量数据并进行处理之后再展示给用户。

2.3 数据处理

当需要对大量数据进行处理或者排序时,可以使用 Web Worker 将处理逻辑放在后台线程中进行,提高处理的效率。

2.4 实时通信

可以使用 Web Worker 来处理实时通信的逻辑。在主线程可以与 Web Worker 进行通信,从而实现实时的数据交换。

3. 代码示例

3.1 Worker特性检测

因部分浏览器可能不支持Worker特性,所以为了更好的向下兼容,可以将你的 worker 运行代码包裹在以下代码中(如App.js):

if (window.Worker) {
   // 说明当前浏览器支持使用Worker特性
   // TODO 可初始化Worker
} else {
   // TODO 做其他兼容性处理 
}

3.2 Worker API

Worker 接口是 API 的一部分,指的是一种可由脚本创建的后台任务,任务执行中可以向其创建者收发信息。要创建一个 Worker,只须调用 Worker(URL) 构造函数,函数参数 URL 为指定的脚本。

Worker 也可以创建新的 Worker,当然,所有 Worker 必须与其创建者同源。

支持浏览器:

3.3 SharedWorker API

SharedWorker 接口代表一种特定类型的 worker,可以从几个浏览上下文中访问,例如几个窗口、iframe 或其他 worker。它们实现一个不同于普通 worker 的接口,具有不同的全局作用域。

注意 如果要使 SharedWorker 连接到多个不同的页面,这些页面必须是同源的(相同的协议、host 以及端口))

支持浏览器:

3.4 创建 JavaScript 文件

首先,我们创建一个名为worker.js的文件,比如用来处理网络数据。worker.js将接收到的数据进行处理,并将处理后的结果发送回主线程。

// 监听消息事件
onmessage = (e) => {
  // 获取传递的数据
  const data = e.data;
  
  // TODO 在此处进行数据的处理,并返回结果
  // 模拟数据处理
  setTimeout(() => {    
    // 将处理结果发送给主线程
    postMessage(data);
  }, 1000);
};

3.5 创建 Web Worker

在主线程的App.js中,我们仍然使用了useStateuseEffect来管理组件的状态和副作用。在useEffect中,我们创建了Web Worker的实例,并使用onmessage来监听Worker发送的消息。当Worker发送消息时,我们更新组件的结果状态。在组件卸载时,我们终止了Worker实例的运行。在按钮的点击事件中,我们使用worker.postMessage方法向Worker发送数据以进行处理。当Worker返回结果时,我们可以在组件中显示它。

import React, { useState, useEffect, useRef } from 'react';

function App() {
  const [result, setResult] = useState(null);
  const workerRef = useRef(null);

  useEffect(() => {
    // 创建Web Worker实例
    workerRef.current = new Worker('worker.js');

    // 监听Worker的消息事件
    workerRef?.current?.onmessage = (e) => {
      // 接收到Worker的消息
      setResult(e.data);
    };

    return () => {
      // 组件卸载时,终止Worker实例
      workerRef?.current?.terminate();
    };
  }, []);

  const handleClick = () => {
    // 启动Worker,并传递数据
    workerRef?.current?.postMessage('Data to be processed');
  };

  return (
    <div>
      <button onClick={handleClick}>Start Processing</button>
      <div>{result}</div>
    </div>
  );
}

export default App;

4. 总结

通过以上的示例,您创建了一个名为 worker.js 的 JavaScript 文件,并使用 new Worker() 方法在主线程中创建了一个 Web Worker。主线程通过 worker.postMessage() 向 Web Worker 发送消息,并通过 worker.onmessage 监听从 Web Worker 接收到的消息。在 Web Worker 的代码中,通过 self.postMessage() 将结果发送回主线程,并在主线程中处理和输出结果。

(如有帮助,请记得点赞三连哦~)

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

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

相关文章

2023-07-27 LeetCode每日一题(删除每行中的最大值)

2023-07-27每日一题 一、题目编号 2500. 删除每行中的最大值二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 m x n 大小的矩阵 grid &#xff0c;由若干正整数组成。 执行下述操作&#xff0c;直到 grid 变为空矩阵&#xff1a; 从每一行删除值最大的元素。如果…

VS2022和QT混合编程打包发布程序

1.在开始菜单输入 CMD 找到 Qt5.15.2(MSVC 64-bit) 2.输入windeployqt exe所在路径 3.运行完毕后&#xff0c;双击打开exe文件&#xff0c;可能会报错&#xff0c;缺少相关的dll,找到缺少的dll拷贝到运行文件夹下即可。

数字化管理能给企业带来哪些好处?

企业数字化管理&#xff08;EDM&#xff09;是指使用数字技术和工具来管理企业运营和流程的各个方面。如果有效实施&#xff0c;EDM 可以给企业带来多种好处&#xff0c;提高企业的整体效率、生产力和竞争力。以下是一些主要优点&#xff1a; 1.提高效率&#xff1a;EDM 通过自…

参数自定义配置比例阀放大器

模拟指令输入比例阀放大器通常使用模拟信号来控制其输出&#xff0c;例如10V, 0~5V,0~10V,4~20mA模拟量信号。它可以将输入的模拟信号放大并转换为一个与输入信号成正比的输出信号&#xff0c;从而实现对执行机构的位置或速度控制。 适配各种不带位置反馈比例阀的控制&#xf…

Python 并发编程 Futures

文章目录 说明1. 并发与并行2. Futures 模块2.1 顺序执行2.2 并发执行2.3 并行执行2.4 Executor 对象 3. 全局解释器锁3.1 为什么有 GIL3.2 GIL 工作过程3.3 线程安全 后记 说明 编程中如果能合理利用编程语言的并发编程技巧&#xff0c;都可以极大提升程序的性能。在 Python …

手把手教你激活虹科物联网HMI/网关数据库功能

前言 JMobile Studio 4.5的更新使得虹科物联网HMI/网关可以本地支持MySQL、PostgreSQL以及支持ODBC驱动连接的数据库&#xff0c;实现设备数据的存储&#xff0c;方便企业数据的统筹管理。 因此&#xff0c;本文主要介绍如何激活虹科物联网HMI/网关的数据库功能。 操作步骤 …

淘宝订单截图生成器网页版制作

你是否曾经为手动制作淘宝订单截图而烦恼&#xff1f;现在&#xff0c;有了淘宝订单生成器&#xff0c;这一切都变得轻松起来。 作为一款专为淘宝购物爱好者打造的神器&#xff0c;淘宝订单生成器可以轻松帮你生成美观的订单截图&#xff0c;让你的朋友们羡慕不已。不再需要手…

临床数据 4. 肿瘤克隆进化分析结果解读?

临床数据分析方案 桓峰基因公众号推出临床数据分析方案&#xff0c;整理如下&#xff1a; 临床数据 1. 临床基因突变数据如何发高分&#xff1f; 临床数据 2. 基于NGS的胃癌诊疗全过程的临床应用方案 临床数据 3. 肿瘤微小残留病灶(MRD)如何发文章&#xff1f; 克隆进化生信分析…

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块11

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

UI设计工具都有哪些好用的推荐?

对于UI设计的初学者来说&#xff0c;掌握一个实用且易于使用的界面UI软件是非常重要的。今天&#xff0c;我整理了四个易于使用的界面UI软件。让我们看看。 即时设计 即时设计是一款免费的在线 UI 设计工具&#xff0c;无系统限制&#xff0c;浏览器打开即可使用&#xff0c;…

gin框架内容(二)

上一篇过于gin的内容 https://mp.csdn.net/mp_blog/creation/editor/131953861 CSDNhttps://mp.csdn.net/mp_blog/creation/editor/131953861 一、路由组 为了管理具有相同前缀的URL, 将拥有URL共同前缀的路由划分为一组 为了代码的阅读性&#xff0c;使用{}包裹相同组的路由…

SDN系统方法 | 7. 叶棘网络

随着互联网和数据中心流量的爆炸式增长&#xff0c;SDN已经逐步取代静态路由交换设备成为构建网络的主流方式&#xff0c;本系列是免费电子书《Software-Defined Networks: A Systems Approach》的中文版&#xff0c;完整介绍了SDN的概念、原理、架构和实现方式。原文: Softwar…

【WIN系统】创建任务计划程序:因为空格问题而无法创建的解决办法

在计算机管理中创建任务计划程序如下图&#xff1a; 【问题】 1. 点击“创建任务”或“创建基本任务” 2. 在操作一栏中&#xff0c;我们可以发现&#xff0c;之前已经存在的任务中&#xff0c;“程序或脚本”不带引号&#xff0c;而且允许存在空格。但自己输入时&#xff0c;…

Cesium 实战 - Blender调整模型组件原点,实现直升机尾翼旋转

Cesium 实战 - Blender调整模型组件原点&#xff0c;实现直升机尾翼旋转 1.模型原点问题2.导入模型&#xff08;zhisheng.glb&#xff09;3.导出模型4. 通过 czml 调试代码 某个项目需求&#xff0c;在操作直升机模型的时候&#xff0c;希望直升机机翼和尾翼旋转起来。 机翼旋…

多项目进度把控:选择合适的项目管理系统助力无忧

我相信很多企业都在使用项目管理系统&#xff0c;但你有没有想过为什么要使用这些工具&#xff1f;想象一下&#xff0c;如果我们使用传统的而不是这些项目管理系统&#xff0c;excel或work一些简单的在线文档记录能满足我们的需求吗&#xff1f;当需求发生变化时&#xff0c;这…

前端学习——Vue (Day5)

自定义指令 <template><div><h1>自定义指令</h1><input v-focus ref"inp" type"text" /></div> </template><script> export default {// mounted(){// this.$ref.inp.focus()// }// 2. 局部注册指令di…

桥梁安全监测系统中数据采集上传用 什么?

背景 2023年7月6日凌晨时分&#xff0c;G5012恩广高速达万段230公里加80米处6号大桥部分桥面发生垮塌&#xff0c;导致造成2车受损后自燃&#xff0c;3人受轻伤。目前&#xff0c;四川省公安厅交通警察总队高速公路五支队十四大队民警已对现场进行双向管制。 作为世界第一桥梁…

亚马逊云科技纽约峰会官宣生成式AI产品策略升级

作为云计算领域的领导者和创新者&#xff0c;生成式AI&#xff08;Generative AI&#xff09;一直是亚马逊云科技持续关注和投入的主要方向。在今年4月&#xff0c;亚马逊云科技发布了以Amazon Bedrock为代表的生成式AI产品全家桶&#xff0c;正式入局该赛道并宣布了亚马逊云科…

进程信息查看脚本

一、shell 脚本 该脚本可以根据进程名和进程pid查询进程信息。 输出的进程信息包括&#xff1a;进程 PID、进程命令、进程所属用户、CPU占用率、内存占用率等 查询可选择模式&#xff1a;仅一次还是不限次。 #! /bin/bashprintProcessInfo(){P$1echo "------------------…

15 文本编辑器vim

15.1 建立文件命令 如果file.txt就是修改这个文件&#xff0c;如果不存在就是新建一个文件。 vim file.txt 使用vim建完文件后&#xff0c;会自动进入文件中。 15.2 切换模式 底部要是显示插入&#xff0c;是编辑模式&#xff1b; 按esc&#xff0c;底部要是空白的&#xff0…