当前位置: 首页 > news >正文

Web Worker 和 WebSocket的区别

Web Worker(消息传递机制)

  1. 定义:是为了在浏览器中提供多线程支持,允许 JavaScript 在后台线程运行,而不阻塞主线程。它非常适合执行耗时的计算任务或处理大量数据,避免主线程(通常是 UI 线程)被阻塞,从而保证用户界面的流畅性。
  2. 应用:运行后台任务,执行长时间运行的计算或操作,诸如图像处理、文件处理、大数据分析等。它并不直接与网络通信或实时消息传递相关。
  3. 原理:创建Web Worker分配一个新的线程(即后台线程),它一个独立的执行上下文,和主线程相互隔离,且不能直接操作 DOM 或访问主线程中的变量,它和主线程之间的通信是异步的通常是通过 postMessageonmessage 方法进行数据传输。
    // 创建一个 Worker
    const worker = new Worker('worker.js');// 发送消息到 Worker
    worker.postMessage({ type: 'start', data: 1000 });  // 1000ms 的间隔// 接收 Worker 返回的消息
    worker.onmessage = (event) => {console.log(event.data);  // 输出 Worker 返回的数据
    };// 停止 Worker
    worker.postMessage({ type: 'stop' });
    

应用计时器:

// worker.js
let setIntervaler = null
let count = 0// 启动定时器
function start(timeout) {setIntervaler = setInterval(() => {postMessage({type: 'next',data: ++count})}, timeout)
}// 停止定时器并关闭 Worker
function stop() {clearInterval(setIntervaler)count = 0 // 重置计数self.close() // 关闭 Worker
}// 监听来自主线程的消息
self.addEventListener('message', (e) => {let { type, data } = e.data // 解构消息数据switch (type) {case 'start':start(data) // 启动定时器breakcase 'stop':stop() // 停止定时器breakdefault:break}
})
<template><div><h1>Web Worker 定时器</h1><p>计数: {{ count }}</p><button @click="startTimer" :disabled="isRunning">启动定时器</button><button @click="stopTimer" :disabled="!isRunning">停止定时器</button></div>
</template><script setup>
import { ref, onUnmounted } from 'vue';// 定义 Vue 组件的状态
const count = ref(0);
const isRunning = ref(false);// 创建 Worker 实例
// src\utils\worker.js
const worker = new Worker(new URL('../utils/worker.js', import.meta.url));// 监听 Worker 返回的数据
worker.onmessage = (e) => {const { type, data } = e.data;switch (type) {case 'ready':console.log(data); // Worker 已准备好break;case 'next':count.value = data; // 更新计数器break;default:break;}
};// 启动定时器
const startTimer = () => {worker.postMessage({ type: 'start', data: 1000 }); // 1000 毫秒(1秒)为定时器间隔isRunning.value = true; // 更新状态为运行中
};// 停止定时器
const stopTimer = () => {worker.postMessage({ type: 'stop' });isRunning.value = false; // 更新状态为停止
};// 清理 Worker 实例
onUnmounted(() => {worker.terminate(); // 组件销毁时终止 Worker
});
</script><style scoped>
button {margin: 10px;padding: 10px;font-size: 16px;
}
</style>

WebSocket(握手连接通信)

  1. 定义:是一种在客户端和服务器之间建立持久连接的协议,它允许双方在连接建立后进行双向实时通信。WebSocket 主要用于需要实时数据更新的应用场景,如实时聊天、在线游戏、股票行情、推送通知等
  2. 应用:客户端和服务器之间可以保持一个长连接,允许实时交换数据,适合实时应用程序的场景。
  3. 原理:用 HTTP 协议进行握手建立连接,通信将转为基于 TCP 的实时双向通信(全双工通信),可以随时从客户端或服务器端通过 send 方法发送数据,通过 onmessage 监听接收到的消息。
    // 创建 WebSocket 连接
    const socket = new WebSocket('ws://example.com/socket');// 连接成功后发送消息
    socket.onopen = () => {socket.send('Hello, server!');
    };// 接收来自服务器的消息
    socket.onmessage = (event) => {console.log('Message from server:', event.data);
    };// 发送消息给服务器
    socket.send('Another message');// 关闭连接
    socket.close();
    

总结:

特性Web WorkerWebSocket
主要目的后台线程处理计算任务,避免阻塞主线程双向实时通信,实时数据交换
通信方式主线程与 Worker 通过消息传递客户端与服务器之间的持久连接,双向通信
适用场景长时间运行的计算任务,数据处理实时应用程序,如聊天、推送通知、在线游戏
通信延迟主要用于计算任务,没有即时通信需求适合低延迟、高实时性的双向通信
关闭方式worker.terminate()self.close()socket.close()


追更:

Web Worker 是一个独立的线程,当你调用 self.close() 时,Worker 被终止,所有的状态(如定时器)也会丢失。

因此,想要再次启动定时器则不关闭Worker直到组件被销毁!!!

// worker.js
let setIntervaler = null;
let count = 0;
let isRunning = false; // 标志定时器是否正在运行// 启动定时器
function start(timeout) {if (!isRunning) {isRunning = true; // 标记定时器已启动setIntervaler = setInterval(() => {postMessage({type: 'next',data: ++count});}, timeout);}
}// 停止定时器
function stop() {if (isRunning) {clearInterval(setIntervaler);isRunning = false; // 标记定时器已停止}
}// 监听来自主线程的消息
self.addEventListener('message', (e) => {const { type, data } = e.data;switch (type) {case 'start':start(data); // 启动定时器break;case 'stop':stop(); // 停止定时器break;default:break;}
});
<template><div><h1>Web Worker 定时器</h1><p>计数: {{ count }}</p><button @click="startTimer" :disabled="isRunning">启动定时器</button><button @click="stopTimer" :disabled="!isRunning">停止定时器</button></div>
</template><script setup>
import { ref, onUnmounted } from 'vue';// 定义 Vue 组件的状态
const count = ref(0);
const isRunning = ref(false);// 创建 Worker 实例,保持 Worker 持续存在
const worker = new Worker(new URL('../utils/worker.js', import.meta.url));// 监听 Worker 返回的数据
worker.onmessage = (e) => {const { type, data } = e.data;switch (type) {case 'ready':console.log(data); // Worker 已准备好break;case 'next':count.value = data; // 更新计数器break;default:break;}
};// 启动定时器
const startTimer = () => {if (!isRunning.value) {worker.postMessage({ type: 'start', data: 1000 }); // 1000 毫秒(1秒)为定时器间隔isRunning.value = true; // 更新状态为运行中}
};// 停止定时器
const stopTimer = () => {if (isRunning.value) {worker.postMessage({ type: 'stop' });isRunning.value = false; // 更新状态为停止}
};// 清理 Worker 实例
onUnmounted(() => {worker.terminate(); // 组件销毁时终止 Worker
});
</script><style scoped>
button {margin: 10px;padding: 10px;font-size: 16px;
}
</style>

相关文章:

Web Worker 和 WebSocket的区别

Web Worker&#xff08;消息传递机制&#xff09; 定义&#xff1a;是为了在浏览器中提供多线程支持&#xff0c;允许 JavaScript 在后台线程运行&#xff0c;而不阻塞主线程。它非常适合执行耗时的计算任务或处理大量数据&#xff0c;避免主线程&#xff08;通常是 UI 线程&a…...

JMeter实时性能压测可视化系统整合

一、相关工具简介: JMeter、Grafana 和 InfluxDB 结合实时地收集、分析和展示性能测试数据,进行更好地理解系统的性能表现,及时发现潜在问题并进行优化。 1,JMeter 实时生成性能数据,并将其发送到 InfluxDB 进行存储。2,InfluxDB 存储的数据。3,通过Grafana的仪表板,用…...

无限加载和懒加载及路由滚动及路由滚动不生效

这里写目录标题 列表无限加载懒加载定制路由滚动使用scrollBehavior不起效不管用的原因使用scrollTo来实现路由滚动elMain && elMain.scrollTo(...) 的作用是&#xff1a; 无限加载和懒加载的区别 列表无限加载 无限加载功能在现代网页和移动应用中广泛应用&#xff0…...

CSS底层基础:小白速来

1. CSS简介 CSS (Cascading Style Sheets) 是一种用来描述HTML或XML文档样式的语言。它使得开发者能够控制网页的布局和外观&#xff0c;包括字体、颜色、间距等。CSS通过选择器来指定要应用样式的元素&#xff0c;并定义这些元素的具体样式属性。 基本结构示例&#xff1a; …...

【MySQL 进阶之路】索引概述

第06章_索引 1.什么是索引 索引是存储引擎用于快速找到数据记录的一种数据结构&#xff0c;就好比一本教科书的目录部分&#xff0c;通过目录中找到对应文章的页码&#xff0c;便可快速定位到需要的文章。MySQL中也是一样的道理&#xff0c;进行数据查找时&#xff0c;首先查…...

【C++boost::asio网络编程】有关异步读写api的笔记

异步读写api 异步写操作async_write_someasync_send 异步读操作async_read_someasync_receive 定义一个Session类&#xff0c;主要是为了服务端专门为客户端服务创建的管理类 class Session { public:Session(std::shared_ptr<asio::ip::tcp::socket> socket);void Conn…...

Elasticsearch 的存储与查询

Elasticsearch 的存储与查询 在搜索系统领域&#xff0c;数据的存储与查询是两个最基础且至关重要的环节。Elasticsearch(ES) 在这两方面进行了深度优化&#xff0c;使其在关系型数据库或非关系型数据库中脱颖而出&#xff0c;成为搜索系统的首选。 映射 (Mapping) 映射 (Ma…...

008静态路由-特定主机路由

按照如上配置&#xff0c;用192.168.0.1 电脑ping 192.168.1.1 发现能够ping通 用192.168.0.1 电脑ping 192.168.2.1 发现不能ping通 这是因为192.168.0.1 和 192.168.1.1 使用的是同一个路由器R1。 192.168.0.1 和 192.168.2.1 通信需要先经过R1&#xff0c;再经过R2 &#xf…...

SystemUI 下拉框 Build 版本信息去掉

需求及场景 去掉SystemUI 下拉框 Build 版本信息 如下图所示&#xff1a;去掉 12 &#xff08;SP1A.201812.016) 了解 去掉之前我们先了解它是个什么东西:其实就是一个Build RTM 信息显示 Android_12_build_SP1A.210812.016 修改文件 /frameworks/base/packages/Syste…...

【JS】栈内存、堆内存、事件机制区别、深拷贝、浅拷贝

js中&#xff0c;内存主要分为两种类型&#xff1a;栈内存&#xff08;stack&#xff09;、堆内存&#xff08;heap&#xff09;&#xff0c;两种内存区域在存储和管理数据时有各自的特点和用途。 栈内存 访问顺序 栈是先进后出、后进先出的数据结构&#xff0c;栈内存是内存用…...

如何确保Java爬虫获得1688商品详情数据的准确性

在数字化商业时代&#xff0c;数据的价值日益凸显&#xff0c;尤其是对于电商平台而言。1688作为中国领先的B2B电子商务平台&#xff0c;提供了海量的商品数据接口&#xff0c;这些数据对于市场分析、库存管理、价格策略制定等商业活动至关重要。本文将详细介绍如何使用Java编写…...

【蓝牙通讯】iOS蓝牙开发基础介绍

1. iOS 蓝牙开发基础 在 iOS 中&#xff0c;蓝牙的操作主要是通过 Core Bluetooth 框架来实现。理解 Core Bluetooth 的基本组件和工作原理是学习 iOS 蓝牙开发的第一步。 核心知识点&#xff1a; Core Bluetooth 框架&#xff1a;这是 iOS 系统提供的专门用于蓝牙低功耗&am…...

Vue 90 ,Element 13 ,Vue + Element UI 中 el-switch 使用小细节解析,避免入坑(获取后端的数据类型自动转变)

目录 前言 在开发过程中&#xff0c;我们经常遇到一些看似简单的问题&#xff0c;但有时正是这些细节问题让我们头疼不已。今天&#xff0c;我就来和大家分享一个我在开发过程中遇到的 el-switch 使用的小坑&#xff0c;希望大家在使用时能够避免。 一. 问题背景 二. 问题分…...

echarts的双X轴,父级居中的相关配置

前言&#xff1a;折腾了一个星期&#xff0c;在最后一天中午&#xff0c;都快要放弃了&#xff0c;后来坚持下来&#xff0c;才有下面结果。 这个效果就相当是复合表头&#xff0c;第一行是子级&#xff0c;第二行是父级。 子级是奇数个时&#xff0c;父级label居中很简单&…...

RuoYi-Vue部署到Linux服务器(Jar+Nginx)

一、本地环境准备 源码下载、本地Jdk及Node.js环境安装,参考以下文章。 附:RuoYi-Vue下载与运行 二、服务器环境准备 1.安装Jdk 附:JDK8下载安装与配置环境变量(linux) 2.安装MySQL 附:MySQL8免安装版下载安装与配置(linux) 3.安装Redis 附:Redis下载安装与配置(…...

Linux firewalld常用命令

启动防火墙 systemctl start firewalld 停止防火墙 systemctl stop firewalld 防火墙开机自启动 systemctl enable firewalld 禁止防火墙开机自启动 systemctl disable firewalld 检查防火墙的状态 systemctl status firewalld 重新加载防火墙的配置 firewall-cmd -…...

Vue 组件之间的通信方式

Vue.js 中组件之间的通信是构建复杂应用的关键部分。以下是一些常见的Vue组件通信方式&#xff1a; 1. Props 和 Emit&#xff08;父子组件通信&#xff09; Props&#xff1a;父组件通过props向子组件传递数据。Emit&#xff1a;子组件通过emit触发事件&#xff0c;向父组件…...

el-select 修改样式

这样漂亮的页面&#xff0c;搭配的却是一个白色风格的下拉框 &#xff0c;这也过于刺眼。。。 调整后样式为&#xff1a; 灯红酒绿总有人看着眼杂&#xff0c;但将风格统一终究是上上选择。下面来处理这个问题。 分为两部分。 第一部分&#xff1a;是修改触发框的样式 第二部…...

Java项目实战II基于微信小程序的亿家旺生鲜云订单零售系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着移动互联网技术的不断…...

算法训练营day27(回溯算法03:组合总和,组合总和2,分割回文串)

第七章 回溯算法part03● 39. 组合总和 ● 40.组合总和II ● 131.分割回文串详细布置 39. 组合总和 本题是 集合里元素可以用无数次&#xff0c;那么和组合问题的差别 其实仅在于 startIndex上的控制题目链接/文章讲解&#xff1a;https://programmercarl.com/0039.%E7%BB%84%E…...

80C166/C167芯片内部RAM执行代码技术详解

1. 80C166/C167芯片内部RAM执行代码的技术解析在嵌入式系统开发中&#xff0c;有时我们需要将特定代码从ROM复制到芯片内部RAM执行。这种需求常见于需要改变总线模式的场景&#xff0c;比如在Siemens 80C166/C167微控制器上切换8位/16位模式或改变总线复用配置。根据Siemens官方…...

ChatGPT开源实现全景图:从RLHF原理到主流项目实战指南

1. 项目概述&#xff1a;一份给开发者的ChatGPT开源实现全景图最近几个月&#xff0c;ChatGPT的火爆程度无需多言。作为一名长期关注自然语言处理和开源生态的技术从业者&#xff0c;我观察到社区里涌现出了一大批旨在复现或探索ChatGPT技术路径的开源项目。这背后反映的&#…...

选RFID仓储管理系统厂家别只盯着参数!老采购教你用场景思维找到真正靠谱的供应商

很多企业在选型RFID仓储管理系统时&#xff0c;第一反应是翻遍全网找“RFID智能仓储管理系统厂家有哪些”&#xff0c;然后把七八家供应商的参数表摊在桌上逐一对比。读取速度多少、识别距离多远、支持多少标签同时读取——这些指标当然重要&#xff0c;但如果你的选型逻辑仅停…...

森林-服务器存档

对于想要自建游戏服务器的玩家&#xff0c;云鸢互联是一个不错的专业联机平台选择。它提供稳定、低延迟且724小时在线的服务器环境&#xff0c;助你轻松打造专属游戏世界。平台主打极致的新手友好——全图形化控制面板&#xff0c;无需编写代码&#xff0c;也无需掌握Linux命令…...

Structured3D完整指南:如何用3D结构化数据轻松构建智能室内场景

Structured3D完整指南&#xff1a;如何用3D结构化数据轻松构建智能室内场景 【免费下载链接】Structured3D [ECCV20] Structured3D: A Large Photo-realistic Dataset for Structured 3D Modeling 项目地址: https://gitcode.com/gh_mirrors/st/Structured3D 如果你正在…...

OpenCorePkg黑苹果引导配置:从传统引导到现代解决方案的完整迁移指南

OpenCorePkg黑苹果引导配置&#xff1a;从传统引导到现代解决方案的完整迁移指南 【免费下载链接】OpenCorePkg OpenCore bootloader 项目地址: https://gitcode.com/gh_mirrors/op/OpenCorePkg 面对黑苹果引导过程中的稳定性问题、安全漏洞和硬件兼容性限制&#xff0c…...

NoFences:免费开源的Windows桌面整理神器,让杂乱图标瞬间归位

NoFences&#xff1a;免费开源的Windows桌面整理神器&#xff0c;让杂乱图标瞬间归位 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为Windows桌面上堆积如山的图标而烦…...

为什么92%的团队仍在手写API文档?ChatGPT驱动的智能生成方案已上线,你还在等什么?

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;API文档手写困局的根源与行业现状 在现代微服务与云原生架构普及的背景下&#xff0c;API已成为系统间协作的核心契约。然而&#xff0c;大量团队仍依赖人工编写和维护 OpenAPI&#xff08;Swagger&#xff0…...

UE5 GAS中安全修改Attribute值的四种正确方式

1. 这不是简单的“赋值操作”&#xff0c;而是GAS系统中一次精准的属性干预在UE5的Gameplay Ability System&#xff08;GAS&#xff09;架构下&#xff0c;修改一个Attribute的值——比如让角色的生命值从100变成120&#xff0c;或者让法力值在施法后扣减30点——表面看只是调…...

JMeter分布式压测原理与高可用集群搭建实战

1. 为什么单台JMeter跑不出真实流量——分布式压测不是“加机器”那么简单 你有没有试过用Jmeter对一个新上线的订单服务做压测&#xff0c;本地配了200个线程&#xff0c;结果TPS卡在80就上不去了&#xff0c;CPU才用了35%&#xff0c;网络IO几乎为零&#xff1f;我第一次遇到…...