19_HTML5 Web Workers --[HTML5 API 学习之旅]
HTML5 Web Workers 是一种允许 JavaScript 在后台线程中运行的技术,从而不会阻塞用户界面或其他脚本的执行。通过使用 Web Workers,你可以执行复杂的计算任务而不影响页面的响应速度,提升用户体验。
Web Workers 的特点
Web Workers 是 HTML5 引入的一种多线程解决方案,允许 JavaScript 代码在后台线程中运行。以下是 Web Workers 的一些关键特点:
1. 非阻塞用户界面
- 分离任务:Web Workers 可以将耗时的任务(如复杂的计算、数据处理等)移到后台线程执行,避免阻塞主线程,从而确保用户界面的流畅性和响应性。
2. 多线程支持
- 并发处理:通过创建多个 Worker 实例,可以同时处理不同的任务,充分利用多核处理器的能力,提高应用性能。
3. 消息传递机制
- 通信方式:主线程和 Worker 线程之间通过
postMessage()
方法发送消息,并使用message
事件监听器接收消息。这种机制保证了线程间的安全通信。
4. 受限的环境
- 安全沙箱:为了防止潜在的安全问题,Worker 没有直接访问 DOM 或者某些全局对象(如
window
、document
、parent
等)的能力。然而,它们仍然可以访问一些常用的全局对象,比如navigator
和location
。
5. 生命周期管理
- 动态控制:开发者可以根据需要创建、终止(
terminate
)或让 Worker 自我销毁(close
)。这使得资源管理更加灵活,可以根据实际情况优化性能。
6. 独立于页面生命周期
- 持续运行:尽管 Web Workers 依赖于创建它的页面,但一旦启动,它们可以在页面刷新或导航到其他页面时继续运行,直到被显式终止或页面关闭为止。
7. 同源限制
- 安全性考虑:出于安全原因,Web Workers 只能加载来自同一来源(协议、域名、端口都相同)的脚本文件。跨域请求需要特别处理,通常涉及 CORS(跨域资源共享)策略。
8. 有限的数据共享
- 隔离性:每个 Worker 都有自己的作用域和内存空间,不能直接与其他 Worker 或主线程共享变量或状态。所有数据交换必须通过消息传递来完成。
9. 调试支持
- 开发工具集成:现代浏览器提供了对 Web Workers 的良好支持,包括专用的调试面板和日志输出功能,方便开发者进行故障排除和性能分析。
10. 多种类型
- Dedicated Workers:专门为单个脚本服务,只能与创建它的脚本通信。
- Shared Workers:允许多个浏览上下文(例如不同标签页)共享同一个 Worker 实例,实现更广泛的任务协作。
- Service Workers:用于实现高级功能,如推送通知、后台同步以及离线缓存等,它可以在用户关闭浏览器后仍然保持活跃。
这些特点共同构成了 Web Workers 的强大功能集,使其成为构建高性能、响应式的Web应用程序的重要组成部分。特别是对于那些需要执行复杂计算或处理大量数据的应用来说,Web Workers 提供了一种有效的方式来提升用户体验。
创建和使用 Web Worker
以下是四个创建和使用 Web Worker 的示例,涵盖了不同类型的任务和应用场景。每个示例都展示了如何创建 Worker、发送消息以及处理来自 Worker 的响应。
示例 1:基本的 Web Worker
场景:在后台计算大数目的平方根,并将结果返回给主线程。
worker.js
(Worker 文件)
self.onmessage = function(event) {let data = event.data;console.log('Received:', data);// 计算平方根let result = Math.sqrt(data);// 发送结果回主线程self.postMessage(result);
};
主页面代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Basic Web Worker</title>
<script>
if (window.Worker) {var myWorker = new Worker('worker.js');myWorker.postMessage(1600); // 发送数据到 WorkermyWorker.onmessage = function(event) {console.log('Square root:', event.data);};
} else {console.log('Your browser does not support Web Workers.');
}
</script>
</head>
<body>
</body>
</html>
示例 2:Shared Worker
场景:多个标签页共享同一个 Worker 来同步计数器值。
shared-worker.js
(Shared Worker 文件)
var clients = [];self.onconnect = function(e) {var port = e.ports[0];clients.push(port);port.onmessage = function(event) {let action = event.data;if (action === 'increment') {for (let client of clients) {client.postMessage('Counter incremented');}}};port.start();
};
主页面代码(适用于多个标签页)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Shared Worker Example</title>
<script>
if (window.SharedWorker) {var sharedWorker = new SharedWorker('shared-worker.js');sharedWorker.port.onmessage = function(event) {console.log(event.data);};// sharedWorker.port.postMessage('increment');setTimeout(function() {document.querySelector('button').onclick = function() {sharedWorker.port.postMessage('increment');};}, 300); // 1000 毫秒 = 1 秒} else {console.log('Your browser does not support Shared Workers.');
}
</script>
</head>
<body>
<button>Increase Counter</button>
</body>
</html>
示例 3:处理大量数据
场景:排序一个非常大的数组而不阻塞UI线程。
sort-worker.js
(Worker 文件)
/*** 当Worker接收到消息时,此事件处理函数会被触发* 它对接收到的数据进行排序,并将排序后的结果发回* * @param {MessageEvent} event - 事件对象,包含从主线程发送过来的数据*/
self.onmessage = function(event) {// 从事件对象中获取传递过来的数组let array = event.data;// 对数组进行排序,确保数组中的数字按升序排列array.sort((a, b) => a - b);// 将排序后的数组发回主线程self.postMessage(array);
};
主页面代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Heavy Data Processing</title>
<script>
// 检查浏览器是否支持Web Workers
if (window.Worker) {// 创建一个新的Web Worker对象var sortWorker = new Worker('sort-worker.js');// 生成一个包含100万个随机整数的数组let largeArray = Array.from({length: 1e6}, () => Math.floor(Math.random() * 1e6));// 将大数组发送给Web Worker进行排序sortWorker.postMessage(largeArray);// 接收Web Worker返回的排序后的数组sortWorker.onmessage = function(event) {// 打印排序后的数组的前10个元素console.log('Sorted array:', event.data.slice(0, 10));};
} else {// 如果浏览器不支持Web Workers,打印提示信息console.log('Your browser does not support Web Workers.');
}
</script>
</head>
<body>
</body>
</html>
示例 4:定时任务
场景:每隔一段时间向主线程发送更新通知。
timer-worker.js
(Worker 文件)
// 每秒发送当前时间的时分秒表示,作为时间服务工作者的主循环
setInterval(function() {// 创建一个日期对象,并使用toLocaleTimeString方法获取当前时间的时分秒表示// self.postMessage用于向工作者的监听者发送消息,在这里发送的是当前时间self.postMessage(new Date().toLocaleTimeString());
}, 1000);
主页面代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Timer Worker</title>
<script>
// 检查浏览器是否支持Web Workers
if (window.Worker) {// 创建一个新的Web Worker对象,加载'timer-worker.js'文件var timerWorker = new Worker('timer-worker.js');// 定义接收到Web Worker消息时的处理函数// 当Web Worker发送消息时,此函数将被调用,输出接收到的时间更新信息timerWorker.onmessage = function(event) {console.log('Time update:', event.data);};
} else {// 如果浏览器不支持Web Workers,输出提示信息console.log('Your browser does not support Web Workers.');
}
</script>
</head>
<body>
</body>
</html>
这些示例展示了不同类型的 Web Worker 如何被用来解决各种问题,从简单的计算任务到复杂的交互式应用。根据你的具体需求和技术栈选择最适合的 Worker 类型。
注意事项
使用 HTML5 Web Workers 时,有几个重要的注意事项和最佳实践可以帮助你更有效地利用这项技术,并避免常见的陷阱。以下是详细的注意事项列表:
1. 浏览器兼容性
- 检查支持情况:尽管大多数现代浏览器都支持 Web Workers,但在使用之前应该检查目标用户的浏览器是否支持。可以通过
if (window.Worker)
这样的条件来检测支持。
2. 同源策略
- 资源加载限制:Web Workers 只能加载来自相同来源(协议、域名、端口)的脚本文件。如果你需要从不同来源加载脚本,则需要确保服务器正确配置了 CORS(跨域资源共享)头。
3. 通信机制
- 消息传递:Worker 和主线程之间的通信是通过
postMessage()
方法发送消息以及监听message
事件实现的。所有传递的数据都是通过结构化克隆算法复制的,因此不适合传递大量数据或复杂对象。
4. 性能开销
- 创建和销毁成本:创建和销毁 Worker 都有一定的性能开销。对于轻量级任务,可能不值得启动一个新的 Worker;而对于复杂计算,使用 Worker 则非常有用。考虑将多个小任务合并为一个较大的任务来处理,以减少频繁创建和销毁 Worker 的次数。
5. 内存管理
- 及时终止:当不再需要 Worker 时,应该调用其
terminate()
方法来停止它,释放占用的资源。长期运行且不再使用的 Worker 会浪费系统资源。 - 避免内存泄漏:确保没有未处理的消息队列或者定时器在 Worker 中持续运行,这可能导致内存泄漏。
6. 安全性
- 受限环境:Workers 没有直接访问 DOM 或者某些全局对象的能力,这是为了提高安全性。不要试图绕过这些限制,因为它们有助于保护用户隐私和应用程序的安全性。
7. 调试困难
- 开发工具支持:虽然现代浏览器提供了对 Web Workers 的调试支持,但与普通 JavaScript 脚本相比,调试 Worker 仍然较为复杂。尽量编写清晰易懂的代码,并充分利用日志记录和断点调试功能。
8. 错误处理
- 捕获异常:在 Worker 内部发生的错误不会自动传播到主线程,因此你需要显式地添加错误处理逻辑。可以监听 Worker 的
error
事件来捕获并处理错误。
9. 数据共享
- 独立作用域:每个 Worker 都有自己的作用域和内存空间,不能直接与其他 Worker 或主线程共享变量或状态。所有数据交换必须通过消息传递完成。
10. 文件路径
- 相对路径问题:如果 Worker 文件使用相对路径加载,那么它的路径是相对于主页面的位置,而不是相对于 Worker 文件本身。确保路径设置正确,特别是在复杂的项目结构中。
11. 类型选择
- 选择合适的 Worker 类型:根据需求选择 Dedicated Worker 或 Shared Worker。Dedicated Worker 是专门为单个脚本服务的,而 Shared Worker 可以被多个浏览上下文共享。
12. Service Workers
- 区分用途:不要混淆 Web Workers 和 Service Workers。Service Workers 主要用于实现推送通知、后台同步以及离线缓存等功能,它们的工作方式与 Web Workers 不同。
遵循以上注意事项,可以帮助你在使用 Web Workers 时更加高效和安全,同时确保你的应用能够提供良好的用户体验。
类型
HTML5 Web Workers 提供了多种类型的 Worker,每种类型都有其特定的用途和适用场景。以下是主要的 Web Worker 类型及其特点:
1. Dedicated Workers
- 定义:Dedicated Workers 是最常见的 Worker 类型,它们专门为创建它们的脚本或页面服务。
- 通信:仅与创建它的脚本或页面进行通信,不能与其他 Worker 或其他浏览上下文共享。
- 生命周期:由创建它的脚本控制,当不再需要时可以显式终止(
terminate()
)或让 Worker 自我销毁(close()
)。 - 使用场景:适合用于执行单个任务或与单个页面相关的后台处理。
创建 Dedicated Worker 示例:
// 在主页面中
var worker = new Worker('worker.js');worker.postMessage('Start processing');
worker.onmessage = function(event) {console.log('Message from worker:', event.data);
};
2. Shared Workers
- 定义:Shared Workers 可以被多个浏览上下文(如不同的标签页、iframe 等)共享。
- 通信:通过
Port
对象与各个客户端通信,每个客户端都需要调用port.start()
来开始消息交换。 - 生命周期:只要有一个客户端连接着 Shared Worker,它就会继续运行;当所有客户端断开连接后,Worker 才会关闭。
- 使用场景:适用于需要在多个浏览器窗口或标签页之间共享数据或状态的应用程序。
创建 Shared Worker 示例:
// 在主页面中
var sharedWorker = new SharedWorker('shared-worker.js');sharedWorker.port.start();
sharedWorker.port.postMessage('Hello from page');
sharedWorker.port.onmessage = function(event) {console.log('Message from shared worker:', event.data);
};
3. Service Workers
- 定义:Service Workers 是一种特殊的 Worker,主要用于实现离线支持、推送通知和后台同步等功能。
- 通信:可以在用户关闭浏览器后仍然保持活跃,并拦截和处理网络请求。
- 生命周期:Service Worker 的生命周期是由浏览器管理的,它可以被激活、等待安装或直接跳过等待阶段。
- 使用场景:非常适合用于构建 PWA(渐进式Web应用),提供更好的用户体验,如离线访问、快速加载和推送通知等。
注册 Service Worker 示例:
if ('serviceWorker' in navigator) {window.addEventListener('load', function() {navigator.serviceWorker.register('/service-worker.js').then(function(registration) {console.log('ServiceWorker registration successful with scope: ', registration.scope);}, function(err) {console.log('ServiceWorker registration failed: ', err);});});
}
总结
- Dedicated Workers:适用于需要在后台执行特定任务但不需要跨多个浏览上下文共享的情况。
- Shared Workers:当你有多个浏览上下文需要共享同一个 Worker 实例时非常有用。
- Service Workers:为Web应用提供了更强大的功能,如离线支持和推送通知,是构建现代Web应用不可或缺的一部分。
选择合适的 Worker 类型取决于你的具体需求和技术目标。正确地选择和使用 Worker 类型可以显著提升Web应用的性能和用户体验。
测试代码下载
html5_api代码
相关文章:
19_HTML5 Web Workers --[HTML5 API 学习之旅]
HTML5 Web Workers 是一种允许 JavaScript 在后台线程中运行的技术,从而不会阻塞用户界面或其他脚本的执行。通过使用 Web Workers,你可以执行复杂的计算任务而不影响页面的响应速度,提升用户体验。 Web Workers 的特点 Web Workers 是 HTM…...
【PCIe 总线及设备入门学习专栏 5.1 -- PCIe 引脚 PRSNT 与热插拔】
文章目录 OverviewPRSNT 与热插拔PRSNT 硬件设计 Overview Spec 定义的热插拔是把一个PCIe卡(设备)从一个正在运行的背板或者系统中插入/或者移除。这个过程需要不影响系统的其他功能。插入的新的设备可以正确工作。 显然,这里面需要考虑的问…...
使用docker compose安装gitlab
使用docker compose安装gitlab GitLab简介设置GITLAB_HOME路径创建docker挂载目录获取可用的GitLab版本编写docker-compose.yml文件启动docker基础配置 GITLAB_OMNIBUS_CONFIG修改配置 中文设置数据库配置系统邮箱配置 GitLab简介 GitLab是一个基于Git的开源项目,…...
性能中 UV、PV 和并发量的关系
在性能测试中,UV(独立访客数)、PV(页面浏览量)和并发量是重要的指标,用于评估系统的负载能力。它们之间关系紧密,需要通过合理的计算和示例进行说明。 1. 概念解析 UV(Unique Visito…...
Go语言zero项目服务恢复与迁移文档
## 一. 服务器环境配置 在迁移和配置 项目时,首先需要确保服务器环境正确配置。以下是配置步骤: ### 1. 安装 Go 语言环境 首先,确保 Go 语言环境已经安装,并且配置正确。执行以下步骤: # 下载 Go 语言安装包 wge…...
Redis - Token JWT 概念解析及双token实现分布式session存储实战
Token 定义:令牌,访问资源接口(API)时所需要的资源凭证 一、Access Token 定义:访问资源接口(API)时所需要的资源凭证,存储在客户端 组成 组成部分说明uid用户唯一的身份标识time…...
QT中使用OpenGL function
1.前言 QT做界面编程很方便,QTOpenGL的使用也很方便,因为QT对原生的OpenGL API进行了面向对象化的封装。 如: 函数:initializeOpenGLFunctions()...... 类:QOpenGLVertexArrayObject、QOpenGLBuffer、QOpenGLShader…...
STM32-笔记18-呼吸灯
1、实验目的 使用定时器 4 通道 3 生成 PWM 波控制 LED1 ,实现呼吸灯效果。 频率:2kHz,PSC71,ARR499 利用定时器溢出公式 周期等于频率的倒数。故Tout 1/2KHZ;Ft 72MHZ PSC71(喜欢设置成Ft的倍数&…...
MAC M4安装QT使用国内镜像源在线安装
MAC M4安装QT使用国内镜像源在线安装 一、下载安装包1. 访问[https://www.qt.io/](https://www.qt.io/)下载在线安装包2. 下载结果 二、创建QT账户,安装的时候需要三、安装1. 终端打开安装包2. 指定安装源3. 运行安装完的QT 一、下载安装包 1. 访问https://www.qt.…...
go语言中zero框架项目日志收集与配置
在 GoZero 项目中,日志收集和配置是非常重要的,尤其是在分布式系统中,日志可以帮助开发人员追踪和排查问题。GoZero 提供了灵活的日志系统,能够方便地进行日志的配置和管理。 以下是如何在 GoZero 项目中进行日志收集与配置的基本…...
springboot496基于java手机销售网站设计和实现(论文+源码)_kaic
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本手机销售网站就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…...
iClient3D for Cesium在Vue中快速实现场景卷帘
作者:gaogy 1、背景 iClient3D for Cesium是由SuperMap提供的一个前端3D地图客户端,提供了丰富的功能与接口,使得开发者能够在Web应用中快速集成并展现3D地理信息。而在Vue框架中集成iClient3D,不仅可以利用Vue的响应式特性提高开…...
Elasticsearch-索引的批量操作
索引的批量操作 批量查询和批量增删改 批量查询 #批量查询 GET product/_search GET /_mget {"docs": [{"_index": "product","_id": 2},{"_index": "product","_id": 3}] }GET product/_mget {"…...
TVS二极管选型【EMC】
TVS器件并联在电路中,当电路正常工作时,他处于截止状态(高阻态),不影响线路正常工作,当线路处于异常过压并达到其击穿电压时,他迅速由高阻态变为低阻态,给瞬间电流提供一个低阻抗导通…...
反编译APK获取xml资源
第一步去官网下载 jar 包 最新的即可 apktool官网下载地址 下载好重命名一下 改成 apktool.jar 第二步将你的 apk 和 jar 包放在同一个文件夹下面 第三步在该文件夹下打开 命令行 并输入 java -jar apktool.jar d 测试.apk回车后会正在解析 解析完成后,文件夹下…...
C++ 设计模式:装饰模式(Decorator Pattern)
链接:C 设计模式 链接:C 设计模式 - 桥接模式 装饰模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰模式通过创建一个装饰类来包装原始类&…...
排序算法之快速排序、归并排序
目录 快速排序归并排序的意义 快速排序 思维步骤 具体思想 测试样例解释 代码实现 归并排序 思维步骤 具体思想 测试样例解释 代码实现 快速排序归并排序的意义 快速排序和归并排序不仅仅是一种方法,更重要的是其作为一种算法而节省时间,在…...
一文读懂变分自编码(VAE)
一文读懂变分自编码(VAE) 概述 变分自编码器(Variational Autoencoder, VAE)是一种生成模型,用于学习数据的潜在表示并生成与原始数据分布相似的新数据。它是一种概率模型,通过结合深度学习和变分推断的思想,解决了传…...
【每日学点鸿蒙知识】webview性能优化、taskpool、热更新、Navigation问题、调试时每次都卸载重装问题
1、HarmonyOS webview页面第二次,第三次打开感觉和第一次打开速度差不多,有优化吗,或者有没有webview秒开方案之类的? 目前没有webview秒开的方案,针对web场景的优化参考一下文档:https://developer.huawe…...
周记-唐纳德的《计算机程序设计艺术》
用代码生成代码 开发一个协议,字段有些多,每个字段是QT的属性,需要写Q_PROPERTY,一个一个编辑的话比较繁琐,耗费时间。后来就用代码生成了头文件和源文件,get和set还有signal函数,内容基本都是…...
AR 模型的功率谱
功率谱密度(Power Spectral Density, PSD)的表达式是从信号的自相关函数和系统的频率响应推导出来的,特别是对于 AR(Auto-Regressive,自回归)模型。以下是推导的过程: 1. AR 模型的定义…...
抖音小程序登录(前端通过tt.login获取code换取openId)
抖音小程序登录 抖音开放平台小程序登录: https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/tutorial/basic-ability/microapp-login 前端(通过tt.login获取code) 流程 静默登录依赖小程序 API tt.login,把tt.loginsuccess 回调…...
Linux 更改Jenkins使用其他账户启动
Linux 更改Jenkins使用其他账户启动 步骤一:修改 Jenkins 配置文件1. 编辑 Jenkins 的 systemd 服务文件:2. 在编辑器中添加以下内容:3. 保存并退出编辑器 步骤二:更改 Jenkins 目录的权限步骤三:重新加载 systemd 配置…...
117.【C语言】数据结构之排序(选择排序)
目录 1.知识回顾 2.分析 设想的思路 代码 执行结果 编辑 错误排查和修复 详细分析出错点 执行结果 3.正确的思路 4.其他问题 1.知识回顾 参见42.5【C语言】选择排序代码 点我跳转 2.分析 知识回顾里所提到的文章的选择排序一次循环只比一个数字,和本文接下来要…...
读书系列2024
认知类 1、《人生没有太晚的开始》: 作者摩西奶奶。 书中经典语录:“与其着急忙慌地不知从何开始,不如一切都慢慢来,开始并坚持了,总会有结果的那一天。喜欢一件事,你就慢慢去做吧。” 2、《忏悔录》托尔…...
如何快速又安全的实现端口转发【Windows MAC linux通用】
背景 有很多程序是在虚拟机上运行的,返回的url 又是127.0.0.1。在个人电脑上调试需要解决这个问题。端口转发是一个不错的方法 可能的解决办法: 1.修改程序,返回虚拟机的ip (要改代码,换虚拟机还要再改代码…...
OpenGL变换矩阵和输入控制
在前面的文章当中我们已经成功播放了动画,让我们的角色动了起来,这一切变得比较有意思了起来。不过我们发现,角色虽然说是动了起来,不过只是在不停地原地踏步而已,而且我们也没有办法通过键盘来控制这个角色来进行移动…...
51单片机学习笔记——找不到REG52.H头文件,点亮一个LED
创建工程 将STC型号导入keil并使用 STC可以从官网下载,也可我这的网盘: 链接:https://pan.baidu.com/s/1bO85DPN3IFaXGhiKSwyOrA?pwd7f4h 提取码:7f4h 打开STC,选择“keil仿真设置”,选择“添加型号和头…...
07 基于OpenAMP的核间通信方案
引言 ZYNQ7020有两个CPU核心,这两个核心可以采用SMP或AMP方式进行调度,当采用AMP方式进行调度时核0和核1可以运行不同的操作系统,如核0运行Linux系统,提供有些复杂的用户交互工作,核1运行实时操作系统,对设…...
Ubuntu升级ssh版本到9.8
方案一:实测只有8.9有漏洞不推荐 1、更新软件包列表 sudo apt update 2、查找可用版本 apt-cache policy openssh-server 3、 选择版本 sudo apt install openssh-server1:9.8p1-<具体版本号> 4、 重启 sudo systemctl restart ssh 5、验证版本 /usr/sbin/ss…...
git设置项目远程仓库指向github的一个仓库
要将你的Git项目设置为指向GitHub上的远程仓库,你需要执行以下步骤: 创建GitHub仓库: 登录到你的GitHub账户。点击右上角的 “” 号,选择 “New repository” 创建一个新的仓库。填写仓库的名称,可以添加描述ÿ…...
【实战示例】面向对象的需求建模
前言 博主准备写一个以面向对象为核心思想的软件需求建模、领域建模的系列,总结一整套可落地的DDD的打法,前面几篇文章论述了如何进行面向对象的需求建模,本文将以一个简单的购物商城的需求来演示如何进行面向对象的需求建模。 面向对象的需…...
平方数的判断不用sqrt()函数
//判断一个数是不是平方数,13…(2*m-1)m*mn #include<stdio.h> int main(){ int n; scanf("%d",&n); int i; for(i1;n>0;i2){ nn-1; } if(n0){ printf("YES!\n"); …...
node.js之---回调函数
什么是回调函数? 为什么会有回调函数? 回调函数的特性 回调函数的应用场景 怎么解决回调地狱 什么是回调函数? 回调函数是一个函数,他作为参数传递给另外一个函数,并且会在另外一个函数执行完毕之后被调用&#…...
浏览器http缓存问题
一、什么是浏览器缓存 浏览器将请求过的资源(html、js、css、img)等,根据缓存机制,拷贝一份副本存储在浏览器的内存或者磁盘上。如果下一次请求的url相同时则根据缓存机制决定是读取内存或者磁盘上的数据还是去服务器请求资源文件…...
编写一个简单的引导加载程序(bootloader)
编写一个简单的引导加载程序(bootloader)通常用于嵌入式系统或自定义操作系统。这里,我将为你提供一个基于x86架构的简单汇编语言 bootloader 示例。这个 bootloader 将会在启动时打印一条消息到屏幕上。 使用 NASM 汇编器来编写这个 bootlo…...
Three.js 字体
在 Three.js 中,我们可以通过 FontLoader 加载字体,并结合 TextGeometry 创建 3D 文本。加载字体是因为字体文件包含了字体的几何信息,例如字体的形状、大小、粗细等,而 TextGeometry 则是根据字体信息生成 3D 文本的几何体。 在…...
Jenkins 构建流水线
在 Linux 系统上安装 Jenkins 服务,以及配置自动化构建项目 前置准备环境:docker、docker-compose、jdk、maven 一、环境搭建 1. Jenkins 安装 (1)拉取镜像 # 安装镜像包,默认安装最新版本 docker pull jenkins/jen…...
ES 磁盘使用率检查及处理方法
文章目录 1. 检查原因2. 检查方法3. 处理方法3.1 清理数据3.2 再次检查磁盘使用率 1. 检查原因 磁盘使用率在 85%以下,ES 可正常运行,达到 85%及以上会影响 PEIM 数据存储。 在 ES 磁盘分配分片控制策略中,为了保护数据节点的安全࿰…...
【回溯】LeetCode经典题目总结:组合、排列、子集、分割、N皇后、单词搜索
回溯 组合问题组合总和全排列子集分割回文串N皇后电话号码的字母组合单词搜索括号生成 组合问题 给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 树形结构࿱…...
uniapp开发小程序内嵌h5页面,video视频两边有细小黑色边框
1.问题如图 2.原因分析 是否为设置上述属性呢? 设置了,但是仍然有黑边。经过选中页面元素分析后,判断video元素本身就有这种特点,就是视频资源无法完全铺满元素容器。 3.解决方案...
Ubuntu meson使用
一 下载pip3 ,使用pip3下载 meson sudo apt install python3 sudo apt install python3-pip二 下载 nanjia sudo apt-get install ninja-build三 测试 meson 使用 1 同一个目录下创建两个文件 main.c #include<stdio.h> int main() {printf("meson t…...
实用技巧:关于 AD修改原理图库如何同步更新到有原理图 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/144738332 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
算法排序算法
文章目录 快速排序[leetcode 215数组中的第K个最大元素](https://leetcode.cn/problems/kth-largest-element-in-an-array/)分析题解快速排序 桶排序[leetcode 347 前K个高频元素](https://leetcode.cn/problems/top-k-frequent-elements/)分析题解 快速排序 leetcode 215数组…...
植物大战僵尸杂交版3.0.2版本
更新内容 植物大战僵尸杂交版3.0.2版本的更新内容如下: • 修复BUG: • 游戏内贴图错乱的BUG。 • 无尽模式卡死的BUG。 • 卡牌模仿者的一系列BUG。 • 干扰车可能同时出现多辆的BUG。 • 冒险模式部分关卡无法过关的BUG。 • 新增内容…...
Kafka数据迁移全解析:同集群和跨集群
文章目录 一、同集群迁移二、跨集群迁移 Kafka两种迁移场景,分别是同集群数据迁移、跨集群数据迁移。 一、同集群迁移 应用场景: broker 迁移 主要使用的场景是broker 上线,下线,或者扩容等.基于同一套zookeeper的操作。 实践: 将需要新添加…...
自动化测试模型(一)
8.8.1 自动化测试模型概述 在自动化测试运用于测试工作的过程中,测试人员根据不同自动化测试工具、测试框架等所进行的测试活动进行了抽象,总结出线性测试、模块化驱动测试、数据驱动测试和关键字驱动测试这4种自动化测试模型。 线性测试 首先&#…...
selenium(三)
总结 一、web基础 html、dom对象、javascript基本语法二、元素定位: find_element(定位方式) 八大定位方式:id、name、class、tag_name、class_name、link_text、partial_link_text、xpath、cssxpath://标签名[属性名值 and/or 属性名值]//标签名[tex…...
7.若依参数设置、通知公告、日志管理
参数设置 对系统中的参数进行动态维护。 关闭验证码校验功能 打开页面注册功能 需要修改前端页面代码 通知公告 促进组织内部信息传递 若依只提供了一个半成品,只实现了管理员可以添加通知公告。 日志管理 追踪用户行为和系统运行状况。 登录日志 和操作日志…...
vsftpd虚拟用户及其权限配置
目录 一、应用场景二、配置过程1、安装软件2、新建本地用户3、修改vsftpd的配置文件4、新建虚拟用户目录5、配置虚拟用户(1)创建虚拟用户列表文件(2)生成虚拟用户数据库(3)配置pam认证(4&#…...