HTML5 Web Workers 详解 (2)

三、高级使用

1. 多个 Web Workers

你可以在主线程中创建多个 Web Workers 来处理并行任务。例如,下面的代码创建了两个 Worker 并分别处理不同的任务。

主线程代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Multiple Web Workers Example</title>
</head>
<body><h1>Multiple Web Workers Example</h1><button onclick="startWorkers()">Start Workers</button><p id="result1"></p><p id="result2"></p><script>var worker1, worker2;// 启动多个 Web Workerfunction startWorkers() {// 检查浏览器是否支持 Web Workersif (typeof(Worker) !== "undefined") {if (!worker1) {// 创建第一个 Worker 实例worker1 = new Worker("worker1.js");// 定义 Worker 接收消息的处理函数worker1.onmessage = function(event) {// 将 Worker 返回的结果显示在页面上document.getElementById("result1").innerHTML = "Worker 1 result: " + event.data;};}if (!worker2) {// 创建第二个 Worker 实例worker2 = new Worker("worker2.js");// 定义 Worker 接收消息的处理函数worker2.onmessage = function(event) {// 将 Worker 返回的结果显示在页面上document.getElementById("result2").innerHTML = "Worker 2 result: " + event.data;};}// 向 Worker 发送消息worker1.postMessage("Start working 1");worker2.postMessage("Start working 2");} else {document.getElementById("result1").innerHTML = "Sorry, your browser does not support Web Workers...";document.getElementById("result2").innerHTML = "Sorry, your browser does not support Web Workers...";}}</script>
</body>
</html>
Worker 1 代码(worker1.js)
// worker1.js// 监听主线程发送的消息
onmessage = function(event) {var result = 0;// 模拟一个耗时计算任务for (var i = 0; i < 500000000; i++) {result += i;}// 向主线程发送结果postMessage(result);
};
Worker 2 代码(worker2.js)
// worker2.js// 监听主线程发送的消息
onmessage = function(event) {var result = 1;// 模拟一个耗时计算任务for (var i = 1; i < 1000; i++) {result *= i;}// 向主线程发送结果postMessage(result);
};

2. 共享 Worker

共享 Worker 可以被同一个页面的不同脚本或不同页面的脚本共享使用。需要通过 SharedWorker 构造函数来创建共享 Worker。

主线程代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Shared Web Workers Example</title>
</head>
<body><h1>Shared Web Workers Example</h1><button onclick="startSharedWorker()">Start Shared Worker</button><p id="result"></p><script>var sharedWorker;// 启动共享 Web Workerfunction startSharedWorker() {// 检查浏览器是否支持 Shared Workersif (typeof(SharedWorker) !== "undefined") {if (!sharedWorker) {// 创建新的 Shared Worker 实例,指定工作脚本文件sharedWorker = new SharedWorker("sharedWorker.js");// 定义 Worker 接收消息的处理函数sharedWorker.port.onmessage = function(event) {// 将 Worker 返回的结果显示在页面上document.getElementById("result").innerHTML = event.data;};}// 向 Worker 发送消息sharedWorker.port.postMessage("Start shared working");} else {document.getElementById("result").innerHTML = "Sorry, your browser does not support Shared Web Workers...";}}</script>
</body>
</html>
共享 Worker 代码(sharedWorker.js)
// sharedWorker.js// 监听主线程发送的连接事件
onconnect = function(event) {var port = event.ports[0];// 监听连接端口的消息port.onmessage = function(event) {var result = "Shared Worker received: " + event.data;// 向连接端口发送结果port.postMessage(result);};
};

3. Worker 的限制

  • 不能访问 DOM:Web Workers 没有访问 DOM 的权限。
  • 同源策略:Web Workers 只能加载与其自身脚本同源的资源。
  • 限制的 API:Web Workers 不能访问某些浏览器 API,例如 alertconfirmlocalStorage 等。

四、实战示例:计算质数

下面我们将展示一个更复杂的示例,

利用 Web Worker 来计算质数。

主线程代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Prime Number Calculation with Web Workers</title>
</head>
<body><h1>Prime Number Calculation with Web Workers</h1><button onclick="startPrimeWorker()">Start Prime Calculation</button><p id="primeResult"></p><script>var primeWorker;// 启动 Web Worker 进行质数计算function startPrimeWorker() {if (typeof(Worker) !== "undefined") {if (!primeWorker) {// 创建新的 Web Worker 实例,指定工作脚本文件primeWorker = new Worker("primeWorker.js");// 定义 Worker 接收消息的处理函数primeWorker.onmessage = function(event) {// 将 Worker 返回的结果显示在页面上document.getElementById("primeResult").innerHTML = "Largest Prime: " + event.data;};}// 向 Worker 发送消息primeWorker.postMessage(1000000); // 计算小于 1000000 的质数} else {document.getElementById("primeResult").innerHTML = "Sorry, your browser does not support Web Workers...";}}</script>
</body>
</html>
Web Worker 代码(primeWorker.js)
// primeWorker.js// 判断一个数是否为质数
function isPrime(num) {for (var i = 2; i <= Math.sqrt(num); i++) {if (num % i === 0) {return false;}}return num > 1;
}// 监听主线程发送的消息
onmessage = function(event) {var max = event.data;var largestPrime = 0;// 计算小于 max 的所有质数for (var i = 2; i <= max; i++) {if (isPrime(i)) {largestPrime = i;}}// 向主线程发送结果postMessage(largestPrime);
};

五、常见问题与解决方法

1. 为什么我的 Worker 无法访问 DOM?

Web Workers 设计为运行在独立的上下文中,因此无法直接访问 DOM。如果需要操作 DOM,可以通过消息传递与主线程通信,让主线程处理 DOM 操作。

2. 如何在 Worker 中使用外部脚本?

可以使用 importScripts 方法在 Worker 中加载外部脚本:

importScripts('script1.js', 'script2.js');

3. 如何调试 Web Workers?

调试 Web Workers 可以使用浏览器的开发者工具。在 Chrome 中,可以在 Sources 面板中找到 Worker 的脚本,并设置断点进行调试。

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

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

相关文章

8086 汇编笔记(五):包含多个段的程序

一、在代码段中使用数据 “dw”的含义是定义字型数据 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h code segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hmov bx,0mov ax,0mov cx&#xff0c;8s: add ax cs:[bx]add bx,2loop smov ax,4c00hint 21hcode…

MVC前端定义变量的艺术:深入解析与实战策略

MVC前端定义变量的艺术&#xff1a;深入解析与实战策略 在MVC&#xff08;Model-View-Controller&#xff09;架构中&#xff0c;前端定义变量是一个至关重要的环节。它涉及到数据的存储、传递和展示&#xff0c;直接影响着应用程序的性能和用户体验。本文将从四个方面、五个方…

HBase 常用 shell 操作

下面给大家介绍一些HBase 常用 shell 操作&#xff0c;各位看官看好了啦&#xff0c;我要献丑了。 进入 HBase 客户端命令操作界面 $ bin/hbase shell查看帮助命令 > help查看当前数据库中有哪些表 > list创建一张表 创建 user 表&#xff0c;包含 info、data 两个列…

【Keil 5】Keil 5下载安装激活到2032年(含MDK、C51、STM32单片机)+附带百度网盘链接

这里写目录标题 安装包、激活文件下载1.双击mdk 514开始安装2.一路点next&#xff0c;信息随便写即可3.激活4.安装STM325.激活c51 安装包、激活文件下载 解压密码&#xff1a;lantongxue 链接&#xff1a;https://pan.baidu.com/s/15Aukt0j1HCFyHBE6whuDeg?pwdsjyh 提取码&…

Streamsets-JDBC模式使用更新时间字段数据同步

StreamSets的开源地址&#xff1a;https://github.com/streamsets/datacollector-oss Streamsets官网地址&#xff1a;https://streamsets.com/ Streamsets文档地址&#xff1a;https://docs.streamsets.com/portal/datacollector/3.16.x/help/index.html 我又来写Streamsets了…

LangChain实战技巧之四:当模型(Model)不支持Tool/Function的解决办法

文心大模型两大主力模型已全面免费&#xff0c;可参考我之前发的文章 AI菜鸟向前飞 — 今日三则AI相关新闻 但是&#xff0c;这些模型原生并不支持Tool/Function Call 如下所示&#xff1a; tool def greeting(name: str):向朋友致欢迎语return f"你好啊, {name}"…

基于LabVIEW虚拟示波器设计

随着计算机技术的发展&#xff0c;传统仪器开始向计算机化的方向发展。虚拟仪器是90年代提出的新概念。虚拟仪器技术的提出与发展&#xff0c;标志着二十一世纪自动测试与电子测量仪器领域技术发展的一个重要方向。所谓虚拟仪器&#xff0c;就是在通用的计算机平台上定义和设计…

ROS2自定义服务接口

ROS2自定义服务接口 在src/village_interface 下构建srv文件夹 src/village_interface/srv 下新建一个BorrowMoney.srv 遵循大小写编程规范 # 客户端请求 string name uint32 money # 中间这三个横杠很重要 不能删掉 --- # 服务端响应 bool success uint32 money接口编译 修改…

TDR原理的介绍

目录 简介 简单定义 TDR测试原理 简介 时域和频域就像孪生兄弟一样&#xff0c;经常在测试测量领域同时出现&#xff0c;可谓是工程师们分析问题和解决问题的两大法宝。所以&#xff0c;在某些测试场景中&#xff0c;如果有时域信息的护法&#xff0c;咱们就能从时频域两个维…

创业目标市场的选择和分析

一、市场细分与选择 创业过程中&#xff0c;选择目标市场至关重要。市场细分是将大市场分割成更小的、具有相似需求的群体。市场细分的方法主要有地理、人口、心理和行为四种&#xff1a; 地理细分&#xff1a;根据地区、城市、气候等地理因素进行市场划分。例如&#xff0c;…

【普通切换】【DC-based handover】【DAPS】协议栈分析

移动网络切换 移动通信中切换是保证终端业务的基本流程&#xff0c;而切换时延是终端(UE)不能与任何基站交互(传递)用户面数据包的最短时间。 在5G(NR)网络中当终端(UE)接收到切换命令时&#xff0c;将断开与源小区的连接向目标小区发起随机接入过程。在此期间终端(UE)的数据传…

牛客ONT45 距离是K的二叉树节点【中等 宽度优先遍历 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/e280b9b5aabd42c9b36831e522485622 思路 图&#xff0c;队列 构件图&#xff0c;直接从target出发&#xff0c;扩展到第k层就是答案Java代码 import java.util.*;/** public class TreeNode {* int val 0;* …

架构设计之安全性属性深度剖析:从理论到实践的完美融合

文章目录 引言一、安全性属性的理论探讨1.1 定义说明1.2 安全原则1.3 安全模型1.4 安全机制 二、安全性属性的实践应用2.1 安全风险评估2.2 架构设计中的安全考虑2.3 技术手段和工具2.4 团队协作与沟通2.5 安全政策和流程2.6 合规性和标准2.7 持续监控和改进 三、理论与实践的融…

Python函数进阶

文章目录 1 函数多返回值2 函数多种传参方式2.1 位置参数2.2 关键字参数2.3 缺省参数2.4 不定长参数 3 匿名函数函数作为参数传递lambda匿名函数 1 函数多返回值 def test_return():return 1,2,3 x,y,z test_return() print(x) print(y) print(z)2 函数多种传参方式 2.1 位置参…

0基础认识C语言(理论+实操3)

所有籍籍无名的日子里 我从未看轻自己半分 小伙伴们&#xff0c;一起开始我们今天的话题吧 一、算法操作符 1.双目操作符 为何叫双目操作符呢&#xff1f;其实是因为我们进行加减乘除的时候&#xff0c;至少得需要两个数字进行这些运算&#xff0c;而这个数字就被称为操作数…

基于单片机的微型嵌入式温度测量仪的设计与实现分析

摘要 &#xff1a; 作为信息技术中重要的技术手段之一嵌入式单片机系统已经被应用到越来越多不同的行业领域中。如&#xff0c;各种手持监测设备、智能家电设备等。当前展开对单片机的微型嵌入式温度测量仪的设计和实现研究&#xff0c;从微型嵌入式单片机相关理论入手&#xf…

【实战教程】构建可复用的 Spring Boot starter 微服务组件

案例 Demo&#xff1a;https://gitee.com/regexpei/coding-trainee/tree/demo/20240526_starter 介绍 在 Spring Boot 中&#xff0c;starter 启动依赖就像一个“开箱即用”的工具箱&#xff0c;它包含了第三方组件的配置和依赖&#xff0c;让我们无需手动配置和添加这些组件。…

【多目标跟踪】《FlowMOT: 3D Multi-Object Tracking by Scene Flow Association》论文阅读笔记

0.论文 论文地址链接:https://arxiv.org/pdf/2012.07541v1 通过流的方式跟踪是一个比较新颖的点,所以这里比较关注运动跟踪,是如果做到流的跟踪来预测目标的位置以及ID绑定的。 FlowMOT的框架结构如下所示,本中会主要关注下运动跟踪、数据关联、ID分配、新生/消亡…

python替换占位符为变量,实现读取配置文件

文章目录 背景1、定义正则表达式2、替换变量占位符3、实现功能 背景 使用python编写小工具&#xff0c;有一个配置文件&#xff0c;希望实现类似shell命令的&#xff0c;定义变量并且使用${}或者$来引用。如果有好的建议欢迎讨论。 配置文件示例内容如下: D:\project\test\pr…

Arrays(操作数组工具类)、Lambda表达式

package exercise;import java.util.Arrays;public class ArraysDemo {public static void main(String[] args) {int[] arr {1, 2, 3, 4, 5};//将数组变成字符串System.out.println(Arrays.toString(arr));//二分查找法查找元素//细节1&#xff1a;1.数组必须是有序的 2.元素…