还在让主线程忙到崩溃?用 Web Worker 解锁前端多线程的正确姿势!

超越单线程:Web Worker 在前端性能中的角色 单线程是指在一个进程中只有一个执行线程。这个线程负责处理所有的任务和操作,包括用户输入、界面更新和数据处理。多线程是指在一个进程中可以同时存在多个执行线程。这些线程可以并行处理多个任务,提高程序的效率和响应能力。2) 阅读详情

一、Web Worker 介绍

JavaScript 是一种单线程语言,意味着它在一个时间点只能执行一个任务。尽管如此,一个进程可以包含多个线程,例如浏览器中的 Web Worker 提供了一种在后台线程中运行脚本的方式,从而避免主线程被阻塞。


1. Web Worker 的作用

Web Worker 是浏览器提供的一种多线程机制,允许开发者在后台线程中运行 JavaScript 脚本,主要用于以下场景:

  • 复杂计算:处理大量数据或复杂算法,避免阻塞主线程。
  • 后台任务:如文件处理、音频处理等。
  • 实时更新:如 WebSocket 数据处理、实时图表更新等。

2. 浏览器中的线程模型

谷歌浏览器是一个多进程架构的浏览器,每个进程可以包含多个线程。以下是常见的线程类型及其作用:

线程类型主要任务
主线程页面渲染、用户交互、JavaScript 执行
渲染线程样式计算、布局计算、绘制和合成
工作线程Web Worker、Service Worker 等后台任务
网络线程HTTP 请求、WebSocket 通信
GPU 线程硬件加速渲染、3D 绘制
定时器线程setTimeout、setInterval 等定时任务
I/O 线程文件读写、数据库操作
音频线程音频播放、音频处理

3. Web Worker 的使用示例

以下是一个简单的 Web Worker 示例,用于在后台线程中计算大数的阶乘:

new Worker(js文件)

主线程代码 main.js
const worker = new Worker('worker.js');

worker.postMessage(10); // 向 Worker 发送数据

worker.onmessage = (event) => {
    console.log(`阶乘结果: ${event.data}`);
};
worker.js
// 计算阶乘函数
function factorial(n) {
    if (n === 0 || n === 1) return 1;
    return n * factorial(n - 1);
}

// 接收主线程发送的数据
onmessage = (e) => {
    const result = factorial(e.data); // 计算 e.data 的阶乘
    postMessage(result); // 将结果发送回主线程
};
  • worker 运行在另一个全局上下文中,不同于当前的window
  • worker和主线程传递数据使用 postmessage,响应数据使用onmessage
  • worker 内不能操作dom节点,不能使用windows的方法和属性
  • worker 内部,worker 是有效的全局作用域,直接调用postmessage方法

4. 终止worker

worker.terminate()

5.错误处理

onerror =(meeage,filename,lineno)=>{

}

6.subworker

worker 能够生成更多的 worker

7.引入库和脚本 importScripts引入脚本

importScripts(); /* 什么都不引入 */
importScripts("foo.js"); /* 只引入 "foo.js" */
importScripts("foo.js", "bar.js"); /* 引入两个脚本 */
importScripts("//example.com/hello.js"); /* 你可以从其他来源导入脚本 */

8.共享worker

  const myWorker = new SharedWorker("worker.js");
  myWorker.port.postMessage([first.value, second.value]);


onconnect = (event)=>{
    const port = e.event[0]
    port.onmessage=(e)=>{
        // e.data
    }
}
  • 与一个共享 worker 通信必须通过 port 对象与 worker 通信
  • worker中使用onconnect处理函数来执行代码,
  • 使用事件的 ports 属性来获取端口并存储在变量中。
  • 为端口添加一个 onmessage 处理函数用来做运算并回传结果给主线程
  • worker 有它自己的执行上下文,worker 并不受限于创建它的 document(或者父级 worker)的内容安全策略

9. 其他类型的worker

  • ServiceWorkers 基本上是作为代理服务器,位于 web 应用程序、浏览器和网络(如果可用)之间。离线体验,拦截网络请求
  • Audio Worklet 提供了在 worklet(轻量级的 web worker)上下文中直接完成脚本化音频处理的可能性

10.调试worker线程

f12 下 source / worker可见

在这里插入图片描述

11. worker中可用的函数和接口

  • Navigator
  • fetch
  • Array Date Math String
  • setTimeout setInterval

在一个 worker 中最主要的你不能做的事情就是直接影响父页面。包括操作父页面的节点以及使用页面中的对象

参考 Web Worker API

二、 常用 Web Worker 库

1. react-useworker

react-useworker 是一个 React Hook 库,用于简化 Web Worker 的使用。它允许开发者轻松地将耗时的计算任务移到后台线程中,从而提高应用的性能。

使用方法
  1. 安装库:
    npm install react-useworker
    
  2. 示例代码:
    import useWorker from 'react-useworker';
    
    const App = () => {
         const [workerFn, { kill }] = useWorker((num) => {
              const factorial = (n) => (n <= 1 ? 1 : n * factorial(n - 1));
              return factorial(num);
         });
    
         const handleCalculate = async () => {
              const result = await workerFn(10);
              console.log(`阶乘结果: ${result}`);
         };
    
         return (
              <div>
                    <button onClick={handleCalculate}>计算阶乘</button>
                    <button onClick={kill}>终止 Worker</button>
              </div>
         );
    };
    
    export default App;
    

2. 使用 worker-loader

在 Vue 3 中,可以通过 worker-loader 和 Web Worker 来处理耗时任务。以下是一个使用 Web Worker 的 Vue 3 示例:

配置 Webpack

在 webpack.config.js 中添加以下配置:

module.exports = {
    module: {
        rules: [
             {
                 test: /\.worker\.js$/,
                 use: { loader: 'worker-loader' },
             },
        ],
    },
};
创建 Worker 文件

创建一个 Worker 文件 factorial.worker.js:

// factorial.worker.js
onmessage = (e) => {
    const factorial = (n) => (n <= 1 ? 1 : n * factorial(n - 1));
    postMessage(factorial(e.data));
};
在 Vue 组件中使用

在 Vue 3 组件中使用 Web Worker:

<template>
  <div>
    <button @click="calculateFactorial">计算阶乘</button>
    <p v-if="result !== null">阶乘结果: {{ result }}</p>
  </div>
</template>

<script>
import FactorialWorker from './factorial.worker.js';

export default {
  data() {
    return {
     result: null,
     worker: null,
    };
  },
  methods: {
    calculateFactorial() {
     if (!this.worker) {
       this.worker = new FactorialWorker();
       this.worker.onmessage = (event) => {
        this.result = event.data;
       };
     }
     this.worker.postMessage(10);
    },
  },
  beforeUnmount() {
    if (this.worker) {
     this.worker.terminate();
    }
  },
};
</script>

这两个库可以帮助开发者更高效地使用 Web Worker,简化复杂任务的实现。

→🐒

如何让前端拥有后端的计算能力?十万、百万条数据都是弟弟,一文彻底了解Web Worker 页面中有十万条数据,对其进行复杂运算,需要多久呢? Web Worker为前端带来了后端的计算能力,十万、百万条数据都是弟弟。 Web Worker扩大了前端的业务边界,减轻了因大量计算造成的UI阻塞 阅读详情

相关推荐

Web Workers解决JavaScript主线程卡顿实战指南

JavaScript天生单线程,面对CPU密集型任务(如大数计算、图像处理、数据加密)时极易阻塞渲染主线程,导致页面冻结、交互失灵。其根本原理在于事件循环无法调度同步计算,而async/await、setTimeout等方案仅缓解I/O阻塞,无法突破CPU-bound瓶颈。Web Workers通过创建独立JS执行环境与主线程隔离运行,以postMessage实现异步通信,真正实现浏览器端的多线程并行能力。该技术具备确定性性能、零UI干扰、内存安全等工程价值,广泛应用于前端性能优化、离线计算、WebAsse

cuhongjiao7003的博客 387

前端webWorker 的介绍以及应用

Web Workers 是在浏览器中运行 JavaScript 代码的一种机制,它们在主线程之外运行,可以在后台执行一些任务而不阻塞用户界面。Web Workers 使得在浏览器中执行多线程操作成为可能,这有助于提高性能和响应性。

夜空孤狼啸的博客 5506

C++11多线程编程:从核心库到实战应用全面解析

并发编程是现代软件开发中提升性能的关键技术,它允许多个任务同时执行以充分利用多核处理器资源。其核心原理在于通过线程管理、同步机制和内存模型来协调共享资源的访问,避免数据竞争和死锁。在C++11标准中,多线程支持被正式纳入语言核心,提供了统一、可移植的抽象,极大地简化了并发编程的复杂性。通过std::thread、std::mutex、std::condition_variable等组件,开发者可以构建高性能的并发应用,如服务器后端、游戏引擎和数据处理系统。本文聚焦于C++11多线程编程,深入探讨线程池和生产

weixin_30443731的博客 279

前端web worker的使用

JavaScript是单线程的编程语言,当遇到需要处理大量数据的逻辑计算时需要等待代码按照顺序运行,这会导致用户需要等待这段代码执行完后才能对页面进行操作(UI 交互)严重的可能会前端页面卡死的情况发生。 但有一种方式可以避免这种困境,它就是web worker。 web worker 的作用,就是为 JavaScript 创造多线程环境,worker存在于一个不同的线程中,它和主线程互不干扰,这样就可以把处理大量数据的逻辑计算放在worker里,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。

yh604005215的博客 3928

浏览器即操作系统:AI驱动的App-less开发新范式

现代Web已超越‘页面’范畴,正演进为具备原生硬件访问、持久化存储、多进程隔离与统一身份认证能力的操作系统级运行环境。其技术根基在于PWA、WebAssembly和Service Worker的深度协同,而AI则从交互助手升维为语义解析、服务编排与执行监控的内核级调度器。这种架构天然支持离线自治、跨平台一致与意图驱动,广泛应用于政务‘一句话办事’、工业现场直连PLC、医疗多系统单点登录等高价值场景。开发者需转向服务可发现、状态可共识、权限可语义化的新工程范式——这不仅是前端演进,更是人机交互契约的重构。

diaomeijiao3430的博客 304

C++ Web服务器性能优化:从阻塞到非阻塞架构实现高并发

在构建高性能网络服务时,I/O多路复用和事件驱动是核心基础技术。其原理在于通过单线程或少量线程监控大量文件描述符的就绪状态,当某个描述符的I/O操作就绪时,内核会通知应用程序进行处理,从而避免了传统多线程模型中为每个连接创建线程所带来的巨大内存与上下文切换开销。这种非阻塞架构的技术价值在于能够以极低的资源消耗支撑极高的并发连接数,特别适用于高并发、I/O密集型的场景,如API网关、实时通信和微服务入口。本文通过一个具体的C++ Web服务器优化案例,详细对比了多线程阻塞模型与单线程非阻塞模型,并深入解析了如

chuiqi9947的博客 687

【前端】WebWorker 在前端SPA框架的应用

WebWorker 在前端SPA框架的应用

想想挺好啊 930

C++与Python并发并行编程实战:从概念到工程应用

并发与并行是现代编程中提升程序性能的核心概念。并发关注程序结构,通过任务切换在单核或多核上处理多个任务,提高资源利用率和响应速度;并行则依赖多核硬件,实现任务真正的同时执行以缩短计算时间。理解这两者的差异对于设计高效系统至关重要,尤其在处理I/O密集型或CPU密集型任务时。在工程实践中,C++通过std::thread和std::async提供底层控制,适合高性能系统;Python则因GIL限制,采用asyncio处理高并发I/O,利用multiprocessing实现CPU并行。掌握这些技术能优化Web服

weixin_33853794的博客 337

终极指南:使用workerpool解锁JavaScript多线程异步计算能力

你是否曾经遇到过这样的场景:当你的JavaScript应用正在执行复杂的图像处理或数据加密任务时,整个页面突然卡死,用户点击无响应?这正是JavaScript单线程架构的局限性所在。workerpool异步计算库通过创建智能工作池,将CPU密集型任务分发到独立的线程中执行,让你的应用重新焕发活力。 ## 突破单线程瓶颈的革命性解决方案 JavaScript的单线程事件循环机制虽然简化了并发编程

gitblog_01044的博客 304

Python多核并发真相:GIL本质、子解释器实战与3.13可用路径

Python并发能力受限于其内存管理模型,核心瓶颈并非简单的全局解释器锁(GIL),而是引用计数机制与单解释器进程架构的双重约束。理解GIL作为安全护栏而非性能缺陷的本质,是突破多核困局的前提;CPython 3.13通过稳定化Subinterpreters(子解释器)、增强free-threaded构建支持及引入t-string等底层改进,首次提供了可落地的轻量级隔离计算方案。这些特性不依赖虚幻的‘Python 3.14’,而是面向真实高并发场景——如FastAPI服务吞吐提升、Dask单机加速、实时风控

weixin_30275415的博客 413

1.triton镜像使用

1)拉取镜像2)启动容器指定模型仓库时可以执行server下的./fetch_model.sh,见2.2部分GPU版本的启动CPU版本的启动区别只在于--gpus=1这个参数注意:docker19.03之前的版本使用gpu要指定显卡硬件名,docker19.03之后的需要安装nvidia-container-toolkit或nvidia-container-runtime安装之后要重启docker查看gpus参数是否安装成功重新执行我遇到了如下错误先使用非GPU版本的。

天启的博客 2077

冰狐智能:多线程从入门到精通,让自动化飞起来!

​关键词​:冰狐智能 多线程 自动化开发  JS脚本 ​适用人群​:爬虫工程师、自动化开发者、效率工具爱好者 ​阅读收益​:掌握冰狐智能中多线程的实战技巧,效率提升200%!

weixin_43783094的博客 499

Android OTA 升级实战指南:从原理到实现

本文详细解析了Android OTA升级的原理与实现方法,包括AB升级与Recovery升级的机制对比、OTA升级包制作流程以及应用层升级功能的实现。通过实战案例和常见问题排查指南,帮助开发者掌握Android系统无线升级技术,提升设备维护效率。

weixin_42652674的博客 198

Day 20-21:Linux多线程编程—— 让程序同时干好几件事

单核CPU就像只有一个收银员的超市,顾客排长队。多线程就是给超市多雇几个收银员,大家同时工作,效率翻倍。

ITOfDragon的博客 282

学习C++的递归函数(包含汉诺塔讲解)

简单来讲,递归函数就是函数本身自己调用自己,那么函数又是什么呢?#include <stdio.h> //这行是头文件,不同的头文件可以用不同的函数int main() //这里就是一个main函数//这里是你要编写程序的内容return 0;(这是个小细节如下)所以我们平时用来练习的就是一个main函数,而且是一个整型类型的函数,而这也是最后一句话为什么要加一句 return 0;了,因为它最后要返回整数类型,其它整数也可以,但是大家规定为0,这是C++自带的函数。

2302_81032013的博客 2594

字节跳动程序媛教你如何刷算法题:面试手撕代码我就没怕过

本人上一次刷题还是大一的C语言期末考试……但是面试中算法考核截止上岸前一直保持着100%正确率的光辉记录。 本文将给你指明一条刷题的决胜指南。并从算法的重要性、题库的选择以及刷题的三大步骤分别进行讲解,彻底解决你所有关于面试算法所有的困扰。

Stay Hungry Stay Foolish 求知若饥 虚心若愚 2万+

C++并发编程实战:从多线程到多进程的核心原理与应用

并发编程是现代软件开发中提升程序性能和响应能力的关键技术。其核心原理在于通过多线程或多进程机制,使程序能够同时处理多个任务,从而充分利用多核CPU的计算资源。从技术价值来看,并发编程能有效解决计算密集型任务和高并发场景下的性能瓶颈,是构建高性能服务器、游戏引擎和实时系统的基石。在应用场景上,多线程适用于需要频繁数据共享和快速协作的任务,如网络服务器连接处理;而多进程则更适合需要强隔离性和高稳定性的模块,如浏览器多标签页或微服务。本文聚焦于C++中的并发编程实践,深入探讨了线程安全、数据竞争等核心挑战,并通过

415

hpm6750evk2开发板(四)TCP回送(1000M网口)

再接下来我们修改代码,先找到配置网速的地方,肯定是在enet的初始化函数里面,我们一个函数一个函数找,也可以用单步调试一步一步找,结果发现是在enet_init函数里面调用的rtl8211_basic_mode_default_config函数配置网速的,我们把enet_phy_port_speed_100mbps改为enet_phy_port_speed_1000mbps,重新编译运行试试。首先我们复制一份lwip_tcpecho代码,重命名为lwip_tcpecho_RGMII,如下图所示。

Silas1750的博客 920

《突破性能瓶颈,用 Rust + WASM 实现浏览器端FFT加速300%实战》

传统JavaScript的FFT计算在万级数据点时就会引发严重卡顿,但今天我们将用**Rust + WebAssembly**的组合拳,在浏览器中实现**零依赖、300%加速的傅里叶变换**。[对比图](https://fakeimg.pl/600x200/00ff00,128/000,255/?**技术标签**:`#WebAssembly` `#Rust` `#性能优化` `#前端黑科技` `#音视频开发`| **WASM+4线程** | **3.2** | **±0.1** |// Canvas绘制。

2201_75296978的博客 946

【26美赛D题】2026美赛数学建模(MCM/ICM)思路解析及代码分享

2026美赛D题数学建模竞赛思路解析摘要:本文针对美赛D题提供系统性解决方案,提出四层建模框架(数据层、机理层、模型层、决策层),强调逻辑闭环比模型复杂度更重要。包含通用建模步骤:指标体系构建、状态评估、动态预测和策略优化,并给出Python基础代码框架。论文建议采用七段式结构,突出从现实问题到决策方案的完整闭环。核心在于通过数据驱动方法揭示问题规律,结合多源数据整合、系统行为建模和风险评估,最终形成可落地的决策建议,体现数学建模解决实际问题的能力。

一键难忘的博客 1082

『MaxKB 2.x 开发环境搭建』在Windows下运行最新源码的完整步骤

本文将详细介绍如何在Windows系统中完成MaxKB最新版(2.x)开发环境的搭建,包括前端、后端以及数据库的配置,确保开发者能够顺利启动项目。

老陈聊架构 584

python标准库、threading、multiprocessing、aiomultiprocess、进程/线程 同步、queue(队列)

multiprocessing 包提供了本地和远程并发操作,通过使用子进程而非线程有效地绕过了全局解释器锁。 因此,multiprocessing 模块允许程序员充分利用给定机器上的多个处理器。

freeking101的博客 2万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

深入C++与QT高频面试题(不定时更新)

本文总结了C++、数据库和Qt相关的常见面试题,涵盖以下核心内容: C++特性与智能指针 智能指针(unique_ptr/shared_ptr/weak_ptr)解决内存管理问题 构造函数/析构函数特性,虚函数与纯虚函数区别 STL容器分类与特性(vector/list/set/map等) 多线程编程 线程创建方式(Thread类/moveToThread) 线程同步机制(互斥锁/条件变量/读写锁) 进程间通信方式(管道/共享内存/消息队列) 数据库基础 事务ACID特性与操作流程 索引原理与使用场景 关系

阿博的博客 1255

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Unity WebGL发布实战:从架构原理到性能优化的完整指南

WebGL作为一项基于JavaScript、在浏览器安全沙盒内运行的图形API,其核心原理是将C#代码与Unity运行时通过IL2CPP编译为WebAssembly模块,并与JavaScript胶水代码协同工作。这一架构带来了高性能的跨平台图形渲染能力,其技术价值在于实现了无需安装、即点即玩的沉浸式交互体验,极大地拓展了游戏、教育应用和可视化工具的传播边界。在应用场景上,它尤其适合轻量级游戏、品牌营销H5、在线教育模拟及企业内部工具。然而,要充分发挥其潜力,必须深入理解其单线程瓶颈、严格的内存管理及无直接文

weixin_33946605的博客 555

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++11线程池实现详解:从生产者-消费者模型到性能优化

在多线程编程中,线程池是一种重要的并发资源管理技术,其核心原理基于生产者-消费者模型。该模型通过任务队列解耦任务的提交与执行,有效避免了频繁创建销毁线程带来的性能开销,减少了上下文切换,提升了系统吞吐量和稳定性。在C++11中,可利用标准库的thread、mutex、condition_variable等组件实现线程池,其中任务队列的线程安全设计和条件变量的正确使用是关键。线程池技术广泛应用于Web服务器、数据处理等需要高并发处理的场景,是提升C++程序性能的常用手段。本文通过实现一个简易线程池,深入解析了

weixin_34294649的博客 372
上一篇: 居然还不知道防抖和节流?前端性能优化的必备神器!
下一篇: 浅谈 Vue3 中的设计模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值