setTimeoutsetIntervalrequestAnimationFrame
requestAnimationFrame
详解及与 setTimeout
/setInterval
的比较
requestAnimationFrame
(简称 rAF)是浏览器提供的专门用于 动画渲染 的 API,相比 setTimeout
和 setInterval
,它在性能和流畅度上有显著优势。以下是详细解析和对比:
1. requestAnimationFrame
详解
基本语法
const requestID = requestAnimationFrame(callback);
• callback
:在浏览器下一次重绘之前执行的函数。
• 返回值:requestID
(用于取消:cancelAnimationFrame(requestID)
)。
核心特点
-
与浏览器刷新率同步
• 默认以 60Hz(16.67ms/帧) 的频率执行(匹配屏幕刷新率)。
• 避免丢帧或过度渲染,保证动画流畅。 -
自动暂停后台标签页
• 当页面隐藏或最小化时,rAF
会自动暂停,节省 CPU/GPU 资源。 -
高性能
• 浏览器会优化rAF
的调用,合并同一帧内的多次更新。 -
精确的时间戳参数
• 回调函数接收一个DOMHighResTimeStamp
参数,表示触发时间:requestAnimationFrame((timestamp) => {console.log(timestamp); // 精确到微秒 });
示例:动画循环
function animate() {// 更新动画状态console.log("Animating...");// 循环调用requestAnimationFrame(animate);
}// 启动动画
animate();
2. requestAnimationFrame
vs setTimeout
/setInterval
对比维度
特性 | requestAnimationFrame | setTimeout /setInterval |
---|---|---|
执行频率 | 与屏幕刷新率同步(~60Hz) | 固定时间间隔(可能不匹配刷新率) |
后台标签页行为 | 自动暂停 | 继续执行(浪费资源) |
动画流畅度 | 高(无丢帧) | 可能卡顿(因主线程阻塞或帧率不稳定) |
CPU/GPU 负载 | 低(浏览器优化) | 高(频繁触发回调) |
适用场景 | 动画、高频视觉更新 | 延迟任务、低频轮询 |
关键差异
(1)时间精度与帧率
• rAF
:按屏幕刷新率(如 60Hz)执行,避免过度渲染。
• setTimeout(fn, 16)
:
• 理论上模拟 60Hz,但实际可能因主线程阻塞导致延迟。
• 浏览器最小延迟限制(4ms)可能破坏时序。
(2)资源占用
• rAF
:浏览器智能调度,合并帧内更新。
// 连续调用 rAF 会被优化
requestAnimationFrame(animate);
requestAnimationFrame(animate); // 可能合并到同一帧
• setInterval
:严格按间隔执行,即使前一帧未完成也可能触发新回调,导致堆积。
(3)动画示例对比
setTimeout
实现动画(不推荐)
function animate() {console.log("Animating...");setTimeout(animate, 16); // 尝试模拟 60Hz
}
animate();
问题:
• 可能因主线程阻塞导致卡顿。
• 后台标签页仍执行,浪费资源。
rAF
实现动画(推荐)
function animate() {console.log("Animating...");requestAnimationFrame(animate);
}
animate();
优势:
• 自动匹配刷新率,流畅且节能。
• 后台自动暂停。
3. 如何选择?
使用 requestAnimationFrame
当:
• 需要 流畅动画(如 CSS 变换、Canvas 绘图)。
• 高频更新 UI(如游戏、实时图表)。
• 希望 节省资源(特别是移动端)。
使用 setTimeout
/setInterval
当:
• 需要 精确控制延迟(如 1 秒后跳转页面)。
• 执行 非视觉任务(如轮询 API)。
• 兼容旧浏览器(rAF
需 IE10+)。
4. 进阶技巧
(1)计算帧率(FPS)
let lastTime = 0;
function animate(timestamp) {const fps = 1000 / (timestamp - lastTime); // 计算帧率console.log(`FPS: ${fps.toFixed(2)}`);lastTime = timestamp;requestAnimationFrame(animate);
}
animate();
(2)降级兼容(旧浏览器)
const rAF = window.requestAnimationFrame || window.webkitRequestAnimationFrame || function(callback) {return setTimeout(callback, 16);};
(3)控制动画速度
let startTime;
function animate(timestamp) {if (!startTime) startTime = timestamp;const progress = timestamp - startTime; // 动画已运行时间const duration = 2000; // 动画总时长(2秒)if (progress < duration) {const ratio = progress / duration; // 0~1console.log(`进度: ${(ratio * 100).toFixed(1)}%`);requestAnimationFrame(animate);}
}
animate();
5. 总结
API | 最佳场景 | 注意事项 |
---|---|---|
requestAnimationFrame | 动画、高频渲染 | 无需手动控制帧率 |
setTimeout | 单次延迟任务 | 避免用于动画(可能卡顿) |
setInterval | 低频轮询(如每 5 秒检查数据) | 注意清理(clearInterval ) |
黄金法则:
凡是涉及 视觉更新 的,优先用
requestAnimationFrame
;
非视觉任务(如逻辑控制),再用setTimeout
/setInterval
。
手写 setTimeout
和 setInterval
(JavaScript 实现)
由于 setTimeout
和 setInterval
是浏览器/Node.js 提供的 Web API,我们无法完全用纯 JavaScript 实现它们(因为它们依赖底层事件循环机制)。但我们可以用 JavaScript 模拟 它们的行为,并理解其核心逻辑。
1. 手写 setTimeout
(模拟版)
思路
• 使用 Date.now()
计算时间差。
• 用 requestAnimationFrame
(浏览器)或 while
循环(Node.js)检查是否到达延迟时间。
代码实现(浏览器环境)
function mySetTimeout(callback, delay) {const startTime = Date.now();function checkTime() {const currentTime = Date.now();if (currentTime - startTime >= delay) {callback(); // 时间到了,执行回调} else {requestAnimationFrame(checkTime); // 继续检查}}requestAnimationFrame(checkTime);
}// 测试
mySetTimeout(() => console.log("Hello after 1s"), 1000);
说明:
• requestAnimationFrame
是浏览器 API,用于在下一帧渲染前执行回调(约 60fps
)。
• 此方法 不精确(requestAnimationFrame
不是严格计时器),但能模拟 setTimeout
的异步行为。
2. 手写 setInterval
(模拟版)
思路
• 递归调用 mySetTimeout
实现循环执行。
• 用 clear
方法模拟 clearInterval
。
代码实现
function mySetInterval(callback, interval) {let timerId = null;function execute() {callback();timerId = mySetTimeout(execute, interval); // 递归调用}timerId = mySetTimeout(execute, interval);return {clear: () => {// 模拟 clearIntervalif (timerId) {// 这里需要实现 clearMyTimeout,但简化版无法真正取消console.log("Interval cleared");timerId = null;}}};
}// 测试
const interval = mySetInterval(() => console.log("Tick"), 1000);
setTimeout(() => interval.clear(), 5000); // 5秒后停止
问题:
• 由于 mySetTimeout
无法真正取消(没有 clearMyTimeout
),此方法 无法完全模拟 setInterval
。
3. 更精确的实现(基于 Promise
+ async/await
)
思路
• 用 Promise
+ setTimeout
模拟可控的 mySetTimeout
。
• 用 async/await
实现 mySetInterval
。
代码
// 精确版 mySetTimeout
function mySetTimeout(callback, delay) {return new Promise((resolve) => {setTimeout(() => {callback();resolve();}, delay);});
}// 精确版 mySetInterval
async function mySetInterval(callback, interval) {while (true) {await mySetTimeout(callback, interval);}
}// 测试
(async () => {mySetInterval(() => console.log("Tick"), 1000);
})();
特点:
• 基于原生 setTimeout
,计时更精确。
• 用 while(true)
实现循环,但 无法直接取消(需额外逻辑)。
4. 终极方案(完整模拟 clearTimeout
和 clearInterval
)
思路
• 用 Map
存储所有定时器 ID。
• 提供 clearMyTimeout
和 clearMyInterval
方法。
完整代码
const timers = new Map();
let id = 0;// 模拟 setTimeout
function mySetTimeout(callback, delay) {const timerId = id++;const startTime = Date.now();function checkTime() {const currentTime = Date.now();if (currentTime - startTime >= delay) {callback();timers.delete(timerId); // 执行后移除} else if (timers.has(timerId)) {requestAnimationFrame(checkTime); // 继续检查}}timers.set(timerId, true);requestAnimationFrame(checkTime);return timerId;
}// 模拟 clearTimeout
function clearMyTimeout(timerId) {if (timers.has(timerId)) {timers.delete(timerId); // 标记为取消}
}// 模拟 setInterval
function mySetInterval(callback, interval) {const timerId = id++;function execute() {if (!timers.has(timerId)) return; // 已取消callback();mySetTimeout(execute, interval); // 递归调用}timers.set(timerId, true);mySetTimeout(execute, interval);return timerId;
}// 模拟 clearInterval
function clearMyInterval(timerId) {clearMyTimeout(timerId); // 复用逻辑
}// 测试
const timeoutId = mySetTimeout(() => console.log("Timeout"), 1000);
const intervalId = mySetInterval(() => console.log("Interval"), 1000);setTimeout(() => {clearMyTimeout(timeoutId);clearMyInterval(intervalId);
}, 3000);
说明:
• 用 Map
存储定时器 ID,clearMyTimeout
和 clearMyInterval
可以取消任务。
• 仍然依赖 requestAnimationFrame
,不是严格精确,但能模拟基本行为。
5. 总结
方法 | 优点 | 缺点 |
---|---|---|
mySetTimeout | 简单模拟异步延迟 | 不精确,依赖 requestAnimationFrame |
mySetInterval | 模拟循环执行 | 无法真正取消 |
Promise 版 | 更接近原生行为 | 仍依赖原生 setTimeout |
终极方案 | 支持取消,更完整 | 代码较复杂 |
关键点
setTimeout
和setInterval
是浏览器/Node.js 提供的 API,无法完全用 JS 实现。- 模拟版依赖
requestAnimationFrame
或Promise
,无法做到完全精确。 - 最佳实践:直接使用原生
setTimeout
和setInterval
,除非有特殊需求(如教学、自定义调度)。
希望这份指南帮你理解定时器的底层逻辑! 🚀
相关文章:
setTimeoutsetIntervalrequestAnimationFrame
requestAnimationFrame 详解及与 setTimeout/setInterval 的比较 requestAnimationFrame(简称 rAF)是浏览器提供的专门用于 动画渲染 的 API,相比 setTimeout 和 setInterval,它在性能和流畅度上有显著优势。以下是详细解析和对比…...
Python内置函数---anext()
用于异步迭代器的核心工具,专为处理异步数据流设计。 1. 基本语法 await anext(async_iterator, default) 参数: async_iterator :实现了异步迭代协议的对象(如异步生成器、异步迭代器类)。 default (可选…...
JavaEE——线程安全
目录 前言1.线程安全的定义2.线程安全问题产生的原因2.1 多个线程修改一个变量2.2 修改操作不是原子的2.3 内存可见性引起的线程安全问题 3.解决线程安全问题的方法3.1 通过synchronized关键字加锁3.2 使用volatile关键字 总结 前言 在使用多线程的时候,难免会出现…...
MongoServerError: Authentication failed.处理办法
1停止MongoDB服务: systemctl stop mongod2临时修改MongoDB配置,禁用认证: vim /etc/mongdb.config 在配置文件中找到 security:authorization: disabled # 临时关闭认证3.重启MongoDB服务 # 重启MongoDB服务 sudo systemctl restart mon…...
IOS微信小程序无法显示背景图片
最近线上突然出现了一个问题,就是原来的在线上的小程序无法显示背景图片。而且这个问题只有在IOS上才有。在安卓上是正常的。 然后这里和前端沟通说是,看能不能用苹果手机真机调试。果然也成功复现出来了,部分图片无法显示。 然后在网上找了…...
实验五 8255和LED数码管显示实验
一、实验目的 1.掌握并行接口8255A的工作原理及使用方法。 2.了解七段数码管显示数字的原理。 3.掌握多位数码显示的接口技术。 二、实验电路 三、实验内容 1.静态显示:按图3连接好电路࿰…...
秒杀系统解决两个核心问题的思路方法总结:1.库存超卖问题;2.用户重复抢购问题。
秒杀系统解决两个核心问题 秒杀系统解决两个核心问题:一、解决库存超卖的核心逻辑:解释:原子性保证: 二、如何避免重复抢购:使用 Redis 做唯一标识判断优点: 三、流程完整梳理:四、通过数据库建…...
大数吞小数
A-春_牛客练习赛134 double 的有效数字约 15-17 位十进制,因此: 如果两个数的数量级相差超过 15-16 个数量级,较小的数会被吞掉。...
1-9 堆宝塔
堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小,按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下: 首先准备两根柱子,一根 A 柱串宝塔,一根 B 柱用于临时叠放。把第 1 块彩虹圈…...
Java虚拟机(JVM)平台无关?相关?
计算机的概念模型 计算机实际上就是实现了一个图灵机模型。即,输入参数,根据程序计算,输出结果。图灵机模型如图。 Tape是输入数据,Program是针对这些数据进行计算的程序,中间横着的方块表示的是机器的状态。 目前使…...
第七章--查找
查找表 定义 由同一类型的数据元素(或记录)构成的集合。 1)特点:数据元素的类型相同;结构松散→先后次序无关紧要,只关心是否在集合内。 2)常用操作:查询某个“特定的”数据元素是否在查找表中…...
photo-sphere-viewer 4.8.1在vue中使用
photo-sphere-viewer 加载单张平面图 import { Viewer } from photo-sphere-viewerthis.viewer new Viewer({panorama: ‘完整的url,也可以是一个base64’,// Containercontainer: document.getElementById(viewer1),navbar: true,// Resize the panoramasize: {width: 100%,…...
vue MarkdownIt标签多出了<p>标签导致高度变丑
效果如下: [点击并拖拽以移动] F12观察后发现多了 标签包裹,所以要解决 标签。 在 markdown-it 中禁用自动包裹 <p> 标签的方法 要让 markdown-it 渲染的 Markdown 内容不自动包裹 <p> 标签,你可以使用以下两种方…...
《Java 并发编程实践》阅读笔记(一):线程重要性
文章目录 一. 并发历史二. 线程优势三. 线程带来的风险1. 安全性问题2. 活跃性问题3. 性能问题 四. 线程无处不在示例1: Timer示例2: 远程方法调用(Remote Method Invocation, RMI)示例3: GUI 程序 一. 并发历史 操作系统的出现 大型机时代, 没有操作系统, 一台主机只能执行一…...
算法思想之分治-归并
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之分治-归并 发布时间:2025.4.17 隶属专栏:算法 目录 算法介绍核心思想与步骤时空复杂度分析C代码实现关键特性与优化 例题排序数组题目链接题目描述算法思路代码实现 交易逆序对的总…...
Vue基础(5)_事件修饰符
事件修饰符 Vue中的事件修饰符: 1、prevent:阻止默认事件(常用)。 2、stop:阻止事件冒泡(常用)。 3、once:事件只触发一次(常用)。 4、capture:使用事件的捕获模式。 5、self:只有event.target是当前操作的…...
网络编程 - 1
目录 为什么需要网络编程? —— 丰富的网络资源 什么是网络编程 网络编程中的基本概念 发送端和接收端 请求和相应 客户端和服务端 常见的客户端服务端模型 Socket 套接字 概念 分类 解释 有连接 / 无连接 可靠传输 / 不可靠传输 面向字节流 / 面向数…...
github | 仓库权限管理 | 开权限
省流版总结: github 给别人开权限:仓库 -> Setting -> Cllaborate -> Add people GitHub中 将公开仓库改为私有:仓库 -> Setting -> Danger Zone(危险区) ->Change repository visibility( 更改仓…...
【系统搭建】DPDK关键概念与l2fwd源码解析
DPDK(Data Plane Development Kit)是一套用于高性能网络数据面处理的开发框架,其核心设计在于绕过内核协议栈,它提供了一个用户空间下的高效数据包处理库函数,可以用于快速开发高性能的网络应用程序,如网络…...
【Qt】初识Qt(一)
目录 一、Qt的背景二、认识Qt项目 一、Qt的背景 关于客户端开发: 客户端开发的重要任务,是编写和用户交互的界面,和用户交互的界面有两种风格: TUI:命令行界面,也叫终端界面GUI:图形化界面 Q…...
Django REST framework 并结合 `mixin` 的示例
下面为你提供一个使用 Django REST framework 并结合 mixin 的示例,该示例将实现一个简单的图书管理 API。 项目需求 我们要创建一个图书管理系统的 API,支持对图书信息的创建、读取、更新和删除操作。 实现步骤 1. 项目初始化 首先,确保你已经安装了 Django 和 Django…...
《前端性能优化秘籍:打造极致用户体验》
在当下,网站和应用的性能表现直接关乎用户去留。快速加载、流畅交互的页面能让用户沉浸其中,反之,缓慢的响应速度则会让他们毫不犹豫地离开。对于前端开发者而言,性能优化不仅是技术追求,更是提升用户体验、增强产品竞…...
数据结构与算法学习导航
目录 指导思想资料总结代码随想录hello-algoOI-WIKI 一名麻瓜的刷leetcode的简单概述。 在这里对过去的自己说: 如果你相信算法有用你就刷刷leetcode,如果不相信面试会让你相信。 当然,现在我确实认为算法和数据结构有用,leetcode也有用。 …...
【Python】用Python写一个俄罗斯方块玩玩
【Python】用Python写一个俄罗斯方块玩玩 一、引言1.成品效果展示 二、思考准备1.思考设计2.代码设计2.1 游戏页面2.2 控件设计2.2.1 方块生成2.2.2 方块碰撞2.2.3 方块消融2.2.4 游戏主循环2.2.5 游戏窗口 三、游戏完整版 一、引言 今日看到侄子在玩游戏,凑近一看…...
nginx中的代理缓存
1.缓存存放路径 对key取哈希值之后,设置cache内容,然后得到的哈希值的倒数第一位作为第一个子目录,倒数第三位和倒数第二位组成的字符串作为第二个子目录,如图。 proxy_cache_path /xxxx/ levels1:2 2.文件名哈希值...
【深度学习】详解矩阵乘法、点积,内积,外积、哈达玛积极其应用|tensor系列02
博主简介:努力学习的22级计算机科学与技术本科生一枚🌸博主主页: Yaoyao2024往期回顾:【深度学习】你真的理解张量了吗?|标量、向量、矩阵、张量的秩|01每日一言🌼: “脑袋想不明白的,就用脚想”…...
20.3 使用技巧3
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 20.3.5 禁止追加行与禁止删除行 通常情况下DataGridView最末一行是空白行,在此行单元格输入数据就可以追加新行。如果需要…...
使用代理IP提取数据的步骤是什么?代理IP如何提高爬虫采集效率?
在当今大数据时代,网络爬虫已成为获取互联网信息的重要手段。然而,许多网站为了防止数据被过度抓取,会设置反爬机制,如IP封禁、访问频率限制等。这时,使用代理IP就成为了一种有效的解决方案。本文将详细介绍使用代理IP…...
探索关系型数据库 MySQL
目录 引言 一.SQL的基本操作 1.数据库是什么? 什么是SQL? 1.1.OLTP 1.2.OLAP 1.3.SQL 1.4.DQL 1.5.DML 1.6.DDL 1.7.DCL 1.8.TCL 1.9.数据库术语 2.MySQL体系结构 2.1.连接者 2.2.MySQL 内部连接池 2.3.管理服务和工具组件 2.4.SQL接口 …...
Redis--事务
目录 一、事务介绍 二、事务操作 2.1 MULTI 2.2 EXEC 2.3 DISCARD 2.4 WATCH 2.5 UNWATCH 一、事务介绍 Redis 的事务和 MySQL 的事务概念上是类似的. 都是把一系列操作绑定成⼀组. 让这⼀组能够批量执行. 但是注意体会 Redis 的事务和 MySQL 事务的区别: 1.弱化的原子性…...
【Windows上配置Git环境】
在Windows上配置Git环境可以按照以下步骤进行: 1. 下载Git 打开浏览器,访问Git官方网站https://git-scm.com/downloads。在下载页面中,找到适用于Windows的下载链接,根据你的系统是32位还是64位选择相应的安装包进行下载 。 2.…...
揭秘大数据 | 23、软件定义网络
软件定义网络将网络的边缘从硬件交换机推进到了服务器里面,将服务器和虚拟机的所有部署、管理的职能从原来的系统管理员网络管理员的模式变成了纯系统管理员的模式,让服务器的业务部署变得简单,不再依赖于形态和功能各异的硬件交换机…...
前端api(请求后端)简易template
微信小程序 API 模块模板 基本 API 模块结构 /*** 示例API模块*/ const api require(../api); const config require(../../config/index);// 示例API对象 const exampleApi {// API方法定义... };// 导出模块 module.exports exampleApi;标准 RESTful 请求方法 获取列表…...
【力扣】重排链表
重排链表 代码 class Solution { public:void reorderList(ListNode* head) {//当链表只有一个节点或两个节点时直接返回空,不用重排if (head->next NULL || head->next->next NULL) return;//1. 进行分割链表ListNode* fast head, *slow head;ListNode* end1 N…...
选 Hibernate 还是 MyBatis?全方位差异解读
Hibernate 和 MyBatis 都是 Java 开发中用于处理数据库操作的持久化框架,不过它们在实现技术上存在诸多差异,下面从多个方面进行对比: 1. 映射机制 Hibernate:采用全自动的对象关系映射(ORM)机制…...
SvelteKit 最新中文文档教程(21)—— 最佳实践之图片
前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...
类和对象(下篇)(详解)
【本节目标】 1. 再谈构造函数 2. Static成员 3. 友元 4. 内部类 5. 再次理解封装 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 #include <iostream> using name…...
win10下github libiec61850库编译调试sntp_example
libiec61850 https://github.com/mz-automation/libiec61850 v1.6 简介 libiec61850 是一个开源(GPLv3)的 IEC 61850 客户端和服务器库实现,支持 MMS、GOOSE 和 SV 协议。它使用 C 语言(根据 C99 标准)实现…...
【HDFS入门】HDFS高可用性与容错机制深度解析
目录 引言 1 HDFS高可用架构实现 1.1 基于QJM的NameNode HA架构 1.2 QJM vs NFS实现对比 2 故障切换流程与ZooKeeper作用 2.1 自动故障转移流程 2.2 状态转换机制 3 数据恢复与副本管理 3.1 DataNode故障处理流程 4 快照与数据保护机制 4.1 HDFS快照架构 4.2 快照使…...
Qt QML实现Windows桌面歌词动态播放效果
前言 使用Qt5.15.2,QML实现简单的歌词动态播放效果。 效果图如下: 注:这里只是为了演示播放效果,并未真正加载音频进行播放。可以在此基础上进行扩展。 正文 关键代码 QML部分 import QtQuick 2.15 import QtQuick.Window 2.…...
Qt GUI 库总结
Qt GUI 库总结 Qt GUI 库(QtGui)是 Qt 框架中负责图形用户界面(GUI)开发的核心模块。本文将一步步详解 QtGui,从基础入门到高级应用,帮助你全面掌握其功能。以下内容包括环境配置、基本功能、核心特性及进…...
[dp16_两个数组] 通配符匹配 | 交错字符串 | 两个字符串的最小ASCII删除和
目录 1.通配符匹配 题解 2.交错字符串 题解 3.两个字符串的最小ASCII删除和 1.通配符匹配 链接:44. 通配符匹配 给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 ? 和 * 匹配规则的通配符匹配: ? 可以匹配任何单个字…...
记录一次生产中mysql主备延迟问题处理
登录库: mysql -uXXXX -pXXXX -P3306 -hXXXXXX -A 备库上执行:show slave status\G 查看 seconds_Behind_Master,延迟 2705s,而且还一直在增加。 SHOW CREATE TABLE proc_i_income_temp; -- 查看表的结构 show index from proc…...
【计算机视觉】OpenCV实战项目-AdvancedLaneDetection 车道检测
AdvancedLaneDetection 项目解析 项目概述项目结构功能和步骤依赖项使用方法项目特点改进建议结论运行项目1. 克隆项目仓库2. 安装依赖项创建虚拟环境(可选)激活虚拟环境安装依赖项 3. 准备数据4. 运行项目5. 调整配置(可选)6. 查…...
趣味编程之分布式系统:负载均衡的“雨露均沾“艺术
#此篇文章由Deepseek大力支持😋 凌晨三点,西二旗某火锅店后厨—— “羊肉卷走3号桌!” “肥牛卷去7号!” “虾滑优先给VIP区!” 我蹲在传菜口的监控屏幕前,看着机器人服务生们忙而不乱地穿梭。突然间&am…...
移植firefly core-1126-jd4官方sdk源码到其他rv1126板卡时 kernel启动中失去响应问题解决
问题背景 在项目中采用firefly core-1126-jd4的sdk适配其他rv1126板卡遇到kernel启动中无响应。串口能看到运行到usb、mmc等模块驱动流程,但之后就打印,通过追加打印确认usb、mmc模块的init已经执行完,怀疑是执行其他某个静态编译进kernel的…...
Oracle表的别名不能用as,列的别名可以用as
在 Oracle 数据库中,表的别名和列的别名在使用 AS 关键字时确实有不同规则,以下是详细说明: 1. 表的别名(Table Alias) 不支持 AS 关键字,直接跟在表名后即可。语法示例: S…...
对于“人工智能+教育”的一些思考
如果说人工智能当下最合适的落地场景,那么进入课堂这件事一定是排在靠前的位置。从当下的趋势来看,人工智能进入课堂已经不是设想,而是我们必须要去做的一件事了。 方向有了,但是问题是:人工智能进入中小学课堂到底应该…...
Android audio系统四 audiopolicy与audioflinger播放和录音
播放/录音在上层是通过AudioTrack与AudioRecord实现的。通过一张简单的流程图查看audiopolicy与audioflinger进行了哪些操作...
【Pandas】pandas DataFrame xs
Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签(行标签和列标签&#…...