Web Worker的使用

什么是Web Worker?如何使用Web Worker? JavaScript 语言采用的是单线程的,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。Web Worker是一种在浏览器中实现多线程处理的技术,允许在后台线程中执行脚本,从而避免长时间运行的脚本阻塞用户界面。Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。 阅读详情

Web Worker

在JavaScript中,因为是单线程执行,所以如果在执行过程中遇到一个运算量很大的代码块时,就可能会出现阻塞代码的情况。为了解决这个问题,我们可以采用异步来实现这部分代码,此外,也可以采用Web Worker来解决这个问题。
Web Worker通过将代码放在后台来实现,避免了阻塞的问题。浏览器实现Web Worker的形式很多,如多线程,后台进程或运行在其他处理器核心上的进程。
实际上,在页面中新建的Web Worker与原页面的作用域不为同一个作用域,这正是与加载其他js文件不同的地方。

创建

Web Worker可以直接使用new操作符创建,传入要作为worker对象的js文件作为参数

let worker = new Worker('worker.js')

监听发送的数据和回调函数

在使用Web Worker时,我们通过使用postMessage来传输数据,为onmessage设置回调函数来对发送的数据做响应处理。

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        let worker = new Worker("worker.js")
        // 往worker对象发送一个对象数据
        worker.postMessage({
            msg: 'here is index.html'
        })
    </script>
</body>

</html>
// worker.js
self.onmessage=event=>{
    // 数据放在响应对象的data属性中
    console.log(event.data)
}

在Web Worker中,全局对象是self,所以这里通过给self的onmessage设置回调函数来监听原页面的作用域发送的数据,当然,这里也可以通过this来设置,因为默认情况下this指向全局对象(非严格模式下)
同样的,在worker中也通过postMessage来向原页面的作用域发送数据,在原页面的作用域中通过worker对象的onmessage来监听发送到当前作用域的数据

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        let worker = new Worker("worker.js")
        // 往worker对象发送一个对象数据
        worker.postMessage({
            msg: 'here is index.html'
        })
        worker.onmessage=event=>{
            console.log(event.data)
        }
    </script>
</body>

</html>
// worker.js
self.onmessage=event=>{
    // 数据放在响应对象的data属性中
    console.log(event.data)
}
self.postMessage({
    msg:'here is worker.js'
})

在这里插入图片描述

Worker线程的关闭

Web Worker给我们带来便利性的同时,也带来了一些问题,如果开启过多的Web Worker,无疑会对性能造成不小的损耗,所以我们必须在Worker线程失去作用时手动关闭Worker线程。

Worker线程的关闭可以在创建Web Worker的地方关闭,也可以在其作用域中关闭

在原页面中,通过terminate方法关闭

worker.terminate()

而在Worker的作用域中,通过调用close方法来关闭

self.close()

在Web Worker引入脚本

如果我们在Web Worker中要引入其他脚本,可以通过importScripts来引入,该方法传入多个参数,每个参数代表要引入的脚本的url,以字符串形式传入

// worker.js
importScripts('file1.js','file2.js');
// file1.js
console.log('file1.js')
// file2.js
console.log('file2.js')

这样就会在页面中输出“file1.js”和“file2.js”,引入脚本的执行严格按照传入参数的先后顺序,即使后面的脚本先于前面的脚本加载完,也依然会按先后顺序来执行脚本。

要注意的是,Web Worker中引入的脚本所在的作用域是Web Worker的作用域,即是说,Web Worker引入脚本实际上等同于我们在页面中引入脚本一样,将脚本带到当前的作用域。

Web Worker的全局作用域

在Web Worker中,全局对象指向self对象,而实际上,这个self指向的是worker对象。我们要清楚的是,Web Worker所执行的JavaScript代码的作用域与当前网页中的代码不共享作用域。
Web Worker只提供了一个“最小”的运行环境,在Web Worker中

  • 无法访问DOM,localStorage,sessionStorage
  • location对象变为只读
  • 最小化的navigator对象,包括onLine,appName,appVersion,userAgent,platform属性
    Web Worker中的navigator对象
    在这里插入图片描述
    原页面中的navigator对象
    在这里插入图片描述
  • XMLHttpRequest构造函数

微信小程序中的Worker对象

微信小程序中同样也有Worker对象
使用createWorker来创建对象,onMessage来监听其他线程发送到当前线程的信息,使用postMessage来向其他线程发送信息,使用terminate来关闭线程
详情见小程序官方文档

Dedicated Web Worker 和 Shared Web Worker 当在 HTML 页面中执行脚本(JS)时,页面的状态是不可响应的,直到脚本已完成。 通过使用Web Worker, 我们可以在浏览器后台运行Javascript, 而不占用浏览器自身线程。Web Worker可以提高应用的总体性能,并且提升用户体验。 1、在后台运行Javascript 一般来说Javascript和页面的UI会共用一个线程,所以当点击一个按钮开始运行Javascript后,在这段代码运行完毕之前,页面是无法响应用户操作的,换句话来说就是被“冻结”了。而这段代码可以交给WebWork. 阅读详情

相关推荐

javascript学习——Web Worker

JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。随着电脑计算能力的增强,尤其是多核 CPU 的出现,单线程带来很大的不便,无法充分发挥计算机的计算能力。Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。

白话机器学习 1569

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

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

qq_33539839的博客 1万+

Web Worker 使用教程

Web Worker 是 HTML5 的一项特性,它允许我们在浏览器中创建多线程的 JavaScript 程序,以提高网页的性能和响应能力。在本教程中,我们将学习如何使用 Web Worker 来执行耗时的 JavaScript 任务,以避免阻塞主线程,并提供相应的源代码示例。首先,我们需要创建一个独立的 JavaScript 文件,用于定义 Web Worker 的逻辑。事件监听来自 Web Worker 的消息,当 Web Worker 完成计算后,我们可以从消息中获取计算结果并在页面上显示。

CodeWhizZ的博客 225

Web Worker 基本使用

在Web开发中,JavaScript的单线程特性常常成为性能瓶颈。当我们遇到需要大量计算的场景时(如图像处理、数据分析等),Web Worker 就成为了关键的解决方案。本文将通过一个完整示例,带你快速掌握Web Worker的使用方法。Web Worker是浏览器提供的JavaScript多线程解决方案,它允许我们在后台线程中运行脚本,与主线程并行执行。独立全局上下文无法直接操作DOM通过消息机制通信支持传递可序列化数据什么时候用 Web Worker?计算密集型任务(如加密、数据处理)

qq_66118130的博客 2376

置换矩阵、转置矩阵以及向量空间、子空间

置换矩阵、转置矩阵以及向量空间、子空间导读置换矩阵 导读 MIT矩阵分析课程之后的的二篇笔记。

qq_44677482的博客 1673

不用API Key也能玩转Obsidian AI:本地大模型离线配置全攻略

本文详细介绍了如何在无需API Key的情况下,通过本地部署大型语言模型(LLM)为Obsidian注入AI能力。文章以Ollama为例,提供了从环境准备、模型选择到与Obsidian插件(如Text Generator)集成的完整配置攻略,旨在帮助用户打造一个安全、离线可用的智能笔记工作流,实现数据隐私与AI助力的完美结合。

weixin_29062963的博客 817

Web Worker 简单使用,看这篇文章就够了

Web Worker 是现代 Web 开发中提升性能的关键技术,通过将计算密集型任务卸载到后台线程,显著改善了用户体验。保持 UI 流畅响应充分利用多核 CPU隔离高风险或资源密集型任务实现更复杂的应用场景然而,也需注意其限制和适用场景,避免过度使用导致不必要的复杂性。掌握 Web Worker 将帮助开发者构建更高效、更流畅的 Web 应用。

2501_92798394的博客 1621

常用的集成TTL门电路

本篇主要分析了常用的逻辑门电路与非门,详细分析了电源原理。值得收藏。

ManagerUser的博客 5086

Web Worker 和 Service Worker的区别及使用

WebWorker和ServiceWorker是浏览器提供的两种JavaScript多线程技术,主要区别在于用途和功能。WebWorker用于后台执行CPU密集型任务以避免阻塞主线程,但无法访问DOM或拦截网络请求,生命周期与页面绑定。ServiceWorker则专注于PWA功能如离线缓存、请求拦截和推送通知,独立于页面运行,可控制多个页面。两者都支持postMessage通信,但ServiceWorker还能使用CacheAPI等存储方案。

qq_37550440的博客 1873

高效复用PCB设计:Cadence Sub-Drawing跨项目复制技巧

本文详细介绍了Cadence Allegro中Sub-Drawing功能的应用技巧,帮助PCB工程师高效复用成熟设计模块。通过分步教学,从精准导出到完美导入,并提供了解决坐标错位与DRC冲突的实用避坑指南。掌握这一技巧能显著提升设计效率,实现团队知识的标准化积累与快速复用。

weixin_29172201的博客 395

Raspberry Pi 4 ARM Trusted Firmware 技术解析

摘要: 本文详细介绍了在树莓派4(Raspberry Pi 4)上移植ARM可信固件(TF-A)的实现方案与安全考量。该移植专注于BL31功能,作为非安全世界(如Linux内核)的启动桥梁,支持加载EL2级别程序。文章分析了启动流程、内存映射设计,并对比了RPi3与RPi4的关键差异,指出当前版本缺乏硬件级安全内存保护的局限性。此外,提供了构建指南、配置说明及设备树自动修补的实现细节,强调通过config.txt简单配置即可启动64位内核。该方案充分利用树莓派原有GPU固件流程,兼顾兼容性与简易性。

Linux内核架构师 932

Web Worker

摘要: Web Worker API 允许在后台线程中运行脚本,避免阻塞主线程的UI渲染。文章介绍了Web Worker的基本概念、用法、全局上下文函数及浏览器兼容性,分析了其优势(避免UI阻塞、提升性能)和局限性(不能操作DOM、同源限制等)。通过斐波那契数列计算案例,对比主线程与Worker线程的性能差异,展示Worker在耗时任务中的价值。适用场景包括复杂运算、大数据处理和实时交互等。文末附完整代码示例和演示效果说明。

HuoZhiyan 的博客 1356

Cloud Connector RFC 访问控制深度实践:为 SAP BTP ABAP environment 打通安全、可控的远程连接

本文是一份面向企业ABAP团队与平台工程团队的Cloud Connector RFC访问控制配置指南。文章详细介绍了虚拟主机/实例号、负载均衡、资源白名单等核心概念,并提供了从零开始的配置流程。主要内容包括:通过Cloud Connector建立安全隧道的价值(零暴露、最小权限)、两种连接类型(无负载均衡/带负载均衡)的配置方法、资源白名单设置技巧,以及两个典型应用场景(Custom Code Migration远程检查与BAPI调用)的实操案例。指南基于SAP官方文档,包含落地经验与避坑建议,可帮助团队快

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 146

web worker

Web Worker 为 Web 应用开发带来了多线程编程的能力,有效解决了 JavaScript 单线程模型带来的性能瓶颈问题。通过将耗时任务转移到后台线程执行,Web Worker 能够显著提升 Web 应用的性能和用户体验,在数据处理、复杂计算、实时应用等众多场景中发挥着重要作用。

2403_87566238的博客 1346

Rockchip开发系列 - 3.4.GPIO扩展芯片AW95xx和PCA953X(2)

Rockchip开发系列 - 3.3.GPIO扩展芯片AW95xx和PCA953X(2)

fulinux的博客 1000

27930-2015+充电协议解析

对2015+充电与2015充电进行硬件电路对比、通信协议对比和2015+通信协议解析。

manjixingkong1234的专栏 233

前端web worker的使用

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

yh604005215的博客 3928

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Web worker

Web Worker 通过将耗时任务移至后台线程,显著提升了 Web 应用的响应性。其基于消息的通信机制确保了线程安全,适合处理非 UI 任务(如计算、数据获取)。尽管存在一定限制,但在复杂场景中(如数据处理、实时应用)是不可或缺的工具。

Jsjdjbxjjwjd的博客 1719

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

如何使用 simple-web-worker:一个简易的Web Worker示例

如何使用 simple-web-worker:一个简易的Web Worker示例 一、项目目录结构及介绍 本项目simple-web-worker是一个简单的Web Worker实现案例,旨在展示如何在网页应用中有效地利用Web Worker进行后台处理。下面是项目的目录概览及其功能简介: simple-web-worker/ │ ├── index.html # 主入口文件...

gitblog_00953的博客 1068

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

web-worker使用import web-worker+ES6问题

web-worker使用import web-worker+ES6问题 首先type 必须等于 ‘module’ new Worker('Worker.js', {type: 'module'}) 注意: 如果你引入的 ‘Worker.js’ 有任何引入问题. 控制台 不会有任何提示web-worker 会在主线程 worker.onerror 执行回调. 但是很遗憾的是. 我找不到报错信息… let worker = new Worker('Worker.js', {typ

d351064378的博客 5389

在Vue中 使用 Web Worker

/ 线程之间通过postMessage进行通信。// 监听message事件。// 获取计算开始的时间。// 获取计算结束的时间。// 得到总的计算时间。

Demon's blog 790

浅谈Web Worker和Service worker

探讨浏览器的 Web worker 及 Service worker

蛋黄酱来一勺 3024
上一篇: HTTP基本学习与演变中(HTTP/0.9,HTTP/1.0,HTTP/1.1,HTTP/2.0,HTTPS)的比较
下一篇: pwa学习整理 manifest的配置
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值