当前位置: 首页 > news >正文

Promise并发控制与HTTP请求优化

Promise并发方法对比

全部成功✅
任一失败❌
全部处理完毕
不论成功失败
竞争模式
最快的胜出
竞争模式
最快成功的胜出
Promise并发方法
Promise.all
Promise.allSettled
Promise.race
Promise.any
返回所有结果数组
返回状态和结果数组
返回最先完成的结果
返回最先成功的结果

Promise.all vs Promise.allSettled

// Promise.all - 一个失败则全部失败
try {const results = await Promise.all([fetch('/api/data1'),fetch('/api/data2'),fetch('/api/data3')]);// 所有请求都成功results.forEach(r => console.log(r));
} catch (error) {// 任一请求失败console.error('至少一个请求失败:', error);
}// Promise.allSettled - 处理混合结果
const results = await Promise.allSettled([fetch('/api/data1'),fetch('/api/data2'),Promise.reject('API不可用')
]);results.forEach(result => {if (result.status === 'fulfilled') {console.log('成功:', result.value);} else {console.log('失败:', result.reason);}
});

Promise.race vs Promise.any

// Promise.race - 返回最快完成的(成功或失败)
const raceResult = await Promise.race([fetch('/api/fast').then(() => '快速API'),fetch('/api/slow').then(() => '慢速API'),new Promise((_, reject) => setTimeout(() => reject('超时'), 3000))
]);// Promise.any - 返回最快成功的
try {const anyResult = await Promise.any([fetch('/api/might-fail').then(() => 'API1'),fetch('/api/backup').then(() => 'API2'),fetch('/api/last-resort').then(() => 'API3')]);console.log('第一个成功的请求:', anyResult);
} catch (error) {console.log('所有请求都失败了:', error.errors);
}

HTTP/2 多路复用技术

HTTP/2
HTTP/1.1
TCP连接1
TCP连接2
TCP连接3
TCP连接4
单一TCP连接
单一TCP连接
单一TCP连接
单一TCP连接
服务器
请求1
请求2
请求3
请求4
服务器
请求1
请求2
请求3
请求4

HTTP/2 核心特性

  • 多路复用:单一TCP连接上可并行传输多个请求/响应
  • 二进制分帧:将信息分割为更小的帧,并进行二进制编码
  • 头部压缩:使用HPACK算法减少HTTP头部大小
  • 服务器推送:允许服务器主动推送资源给客户端
// HTTP/2自动应用多路复用,无需特殊代码
// 只需确保服务器支持HTTP/2并正确配置
// 示例:使用fetch API自动利用HTTP/2(浏览器会自动选择)
async function loadResources() {// 这些请求会在支持HTTP/2的环境中自动多路复用const [data1, data2, data3] = await Promise.all([fetch('/api/resource1').then(r => r.json()),fetch('/api/resource2').then(r => r.json()),fetch('/api/resource3').then(r => r.json())]);return { data1, data2, data3 };
}

AbortController 取消请求

客户端 AbortController 服务器 new AbortController() fetch(url, {signal: controller.signal}) 用户决定取消请求 controller.abort() 取消请求信号 请求被中止 客户端 AbortController 服务器

实际应用示例

// 基本用法 - 超时取消
async function fetchWithTimeout(url, timeout = 5000) {const controller = new AbortController();const { signal } = controller;// 设置超时自动取消const timeoutId = setTimeout(() => controller.abort(), timeout);try {const response = await fetch(url, { signal });clearTimeout(timeoutId);return response;} catch (error) {if (error.name === 'AbortError') {throw new Error(`请求超时:${url}`);}throw error;}
}// 用户交互取消
function searchWithCancel() {// 在组件状态中保存控制器let controller;async function handleSearch(query) {// 取消上一个未完成的请求if (controller) controller.abort();// 创建新的控制器controller = new AbortController();try {const results = await fetch(`/api/search?q=${query}`, {signal: controller.signal}).then(r => r.json());return results;} catch (error) {if (error.name !== 'AbortError') {console.error('搜索错误:', error);}}}function cancelSearch() {if (controller) controller.abort();}return { handleSearch, cancelSearch };
}

服务端请求合并技术

客户端多个请求
请求聚合层
批处理引擎
数据库/后端服务
合并响应返回客户端

GraphQL批处理

// 客户端:批量查询
const query = `{user(id: "123") {nameemailposts {titlecomments {author {name}text}}}
}`;// 一次请求获取深层嵌套的所有相关数据
fetch('/graphql', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ query })
}).then(r => r.json());

服务端批处理实现

// 服务端:请求批处理中间件
class BatchProcessor {constructor(timeout = 50) {this.batchTimeout = timeout;this.batches = new Map();}// 添加请求到批处理队列add(batchKey, request) {if (!this.batches.has(batchKey)) {this.batches.set(batchKey, {requests: [],timer: setTimeout(() => this.processBatch(batchKey), this.batchTimeout)});}const batch = this.batches.get(batchKey);return new Promise((resolve, reject) => {batch.requests.push({params: request,resolve,reject});});}// 处理一个批次的请求async processBatch(batchKey) {const { requests, timer } = this.batches.get(batchKey);this.batches.delete(batchKey);clearTimeout(timer);if (requests.length === 0) return;try {// 将多个请求合并为一个const params = requests.map(r => r.params);const results = await this.executeBatch(batchKey, params);// 将结果分配给各个原始请求requests.forEach((req, i) => {req.resolve(results[i]);});} catch (error) {// 错误处理 - 所有请求都失败requests.forEach(req => {req.reject(error);});}}// 执行批处理 - 由子类实现具体逻辑async executeBatch(batchKey, params) {throw new Error('需要子类实现');}
}// 使用示例:数据库查询批处理
class UserBatchLoader extends BatchProcessor {async executeBatch(batchKey, userIds) {// 一次查询多个用户const users = await db.collection('users').find({ _id: { $in: userIds } }).toArray();// 按照请求顺序返回结果return userIds.map(id => users.find(user => user._id.toString() === id));}
}// Express中间件应用
app.get('/api/users/:id', async (req, res) => {try {const userLoader = new UserBatchLoader();const user = await userLoader.add('users', req.params.id);res.json(user);} catch (error) {res.status(500).json({ error: error.message });}
});

数据库N+1问题解决

// 假设有一个博客API,需要获取文章及其评论
// 未优化版本 - 导致N+1问题
app.get('/api/posts', async (req, res) => {const posts = await db.collection('posts').find().toArray();// 问题:每篇文章都要单独查询一次评论 (N+1查询)for (const post of posts) {post.comments = await db.collection('comments').find({ postId: post._id }).toArray();}res.json(posts);
});// 优化版本 - 批量查询
app.get('/api/posts', async (req, res) => {const posts = await db.collection('posts').find().toArray();const postIds = posts.map(p => p._id);// 一次查询所有文章的所有评论const allComments = await db.collection('comments').find({ postId: { $in: postIds } }).toArray();// 内存中组织数据结构const commentsByPostId = allComments.reduce((acc, comment) => {acc[comment.postId] = acc[comment.postId] || [];acc[comment.postId].push(comment);return acc;}, {});// 为每篇文章分配评论posts.forEach(post => {post.comments = commentsByPostId[post._id] || [];});res.json(posts);
});

综合应用示例

// 创建一个请求管理器,结合多种技术
class RequestManager {constructor() {this.cache = new Map();this.batchProcessor = new BatchProcessor();}async fetch(url, options = {}) {// 1. 检查缓存const cacheKey = `${url}:${JSON.stringify(options)}`;if (this.cache.has(cacheKey)) {return this.cache.get(cacheKey);}// 2. 请求合并(相同URL的请求在短时间内合并)const controller = new AbortController();options.signal = controller.signal;// 3. 设置超时const timeoutId = setTimeout(() => controller.abort(), options.timeout || 30000);try {// 4. 利用HTTP/2多路复用自动优化const response = await fetch(url, options);clearTimeout(timeoutId);// 5. 缓存结果const data = await response.json();this.cache.set(cacheKey, data);return data;} catch (error) {clearTimeout(timeoutId);if (error.name === 'AbortError') {throw new Error(`请求超时: ${url}`);}throw error;}}// 批量获取数据async batchFetch(requests) {return Promise.allSettled(requests.map(req => this.fetch(req.url, req.options)));}
}

🔑 关键点总结

  1. Promise管理

    • Promise.all - 全部成功或一个失败则全部失败
    • Promise.allSettled - 全部完成,返回每个结果状态
    • Promise.race - 返回最快的结果(成功或失败)
    • Promise.any - 返回最快的成功结果
  2. HTTP/2多路复用优势

    • 单一TCP连接处理多请求
    • 减少连接建立开销
    • 避免TCP慢启动影响性能
    • 并行请求不阻塞
  3. AbortController应用场景

    • 用户取消长时间运行的请求
    • 超时自动取消
    • 新请求替换旧请求
    • 页面导航时取消未完成请求
  4. 服务端请求合并技术

    • 批量数据库查询
    • GraphQL聚合请求
    • DataLoader缓存与批处理
    • 微服务聚合层

相关文章:

Promise并发控制与HTTP请求优化

Promise并发方法对比 #mermaid-svg-tnmGzOkgNUCrbvfI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-tnmGzOkgNUCrbvfI .error-icon{fill:#552222;}#mermaid-svg-tnmGzOkgNUCrbvfI .error-text{fill:#552222;stroke…...

G1垃圾回收器中YoungGC和MixedGC的区别

在 G1 垃圾回收器中,Mixed GC 和 Young GC 的区别主要体现在以下几个方面: 作用范围 Young GC:仅针对年轻代中的Region进行回收,包括 Eden 区和 Survivor 区的 Region。Mixed GC:会回收所有年轻代的 Region 以及部分…...

Web4.0身份革命:去中心化身份系统的全栈实现路径

去中心化身份(DID)技术栈正在重构数字世界的信任根基,本文从密码学协议、存储网络、验证框架三个维度,解析符合W3C标准的身份系统构建方案。通过Hyperledger Aries架构实践,揭示如何实现跨链身份互通、数据主权控制、零…...

iOS/Flutter混合开发之PlatformView配置与使用

环境:Xcode 16.3、Flutter 3.29.2、Dart 3.7.2。 使用背景:需要在flutter界面中嵌入一个iOS原生控件。 步骤: 1. iOS侧实现: 1.1:PlatformView实现 class FLNativeView: NSObject, FlutterPlatformView {private v…...

Libconfig 修改配置文件里的某个节点

THCommandStatus ( { Status "1"; index 5; }, { Status "2"; index 8; }, { Status "3"; index 7; }, { Status "4"; index 0; } ); 比如这是配置文件的内容&#xff…...

【金仓数据库征文】_AI 赋能数据库运维:金仓KES的智能化未来

AI 赋能数据库运维:金仓KES的智能化未来 🌟嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 在当今数字经济飞速发展的时代&#xff0…...

【MySQL】3分钟解决MySQL深度分页问题

什么是深度分页问题?该如何解决呢?这篇文章展开讲讲 什么是深度分页? 当查询结果集非常大时,需要获取靠后页码的数据,比如第1000页、10000页。 如: SELECT * FROM table LIMIT 10000, 10; -- 获取第10001-10010条…...

GitHub 趋势日报 (2025年04月24日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1kortix-ai/sunaSuna - Open Source Generalist AI Agent⭐ 1105⭐ 3639TypeScript2cloudcommunity/Free-CertificationsA curated …...

一种双模式机器人辅助股骨干骨折钢板植入方法

股骨干骨折是一种常见的高能损伤,微创内固定是首选治疗方法。然而,钢板植入过程中存在不可见、不准确和不稳定等问题。山东大学研究团队提出了一种双模式机器人辅助钢板植入方法,通过神经网络模型规划钢板植入轨迹,然后利用机械臂…...

全球碳化硅晶片市场深度解析:技术迭代、产业重构与未来赛道争夺战(2025-2031)

一、行业全景:从“材料突破”到“能源革命”的核心引擎 碳化硅(SiC)作为第三代半导体材料的代表,凭借其宽禁带(3.26eV)、高临界击穿场强(3MV/cm)、高热导率(4.9W/cmK&…...

IDEA搭建环境的五种方式

一、普通的java项目 File--New--Project 选择Java,jdk选择1.8版本,然后点next 输入项目名和路径名,点击Finish 创建包结构,编写Class类 编写主方法,输出Hello标志完成 二、普通的javaWeb项目 Java Enterprise-- 勾选…...

隐形革命:环境智能如何重构“人-机-境“共生新秩序

引言 在万物互联的时代,环境智能(Ambient Intelligence, AmI)正以“隐形革命者”的姿态重塑人类生活场景。通过分布式传感器、边缘计算与自适应算法的深度融合,AmI构建出能感知、学习并响应人类行为的智慧环境。 本文基于多领域研…...

Mysql唯一性约束

唯一性约束(Unique Constraint)是数据库设计中用于保证表中某一列或多列组合的值具有唯一性的一种规则。它可以防止在指定列中插入重复的数据,有助于维护数据的完整性和准确性。下面从几个方面为你详细解释 作用 确保数据准确性&#xff1a…...

QuecPython+GNSS:实现快速定位

概述 QuecPython 结合 GNSS(全球导航卫星系统)模块为物联网设备提供开箱即用的定位能力解决方案。该方案支持 GPS/北斗/GLONASS/Galileo 多系统联合定位,为物联网开发者提供从硬件接入到云端服务的全栈式定位解决方案。 优势特点 多体系定…...

【从零开始:自制一个Java消息队列(MQ)】

🚀 从零开始:自制一个Java消息队列(MQ) 在现代分布式系统中,消息队列(Message Queue,MQ)已经成为一个至关重要的组件。它帮助系统在异步处理、负载均衡、解耦等方面提供了强大的支持…...

WHAT - 已阅读书单

指数基金投资指南✅ 我们终将变富 纳瓦尔宝典 围城✅ 许三观卖血记✅ 骆驼祥子✅ 活着 白鹿原✅ 百年孤独 君主论 阿Q正传✅ 蛤蟆先生去看心理医生✅ 思考,快与慢 三体✅ 人类简史:从动物到上帝✅ 明朝那些事✅ 三国演义✅ 中国历代政治得失✅ 资治…...

代码随想录算法训练营第60期第十七天打卡

今天我们继续进入二叉树的下一个章节,今天的内容我在写今天的博客前大致看了一下部分题目难度不算大,那我们就进入今天的题目。 第一题对应力扣编号为654的题目最大二叉树 这道题目的坑相当多,我第一次题目没有看明白就是我不知道到底是如何…...

C 语言数组详解

一、数组的基本概念 在 C 语言中,数组是一种相同数据类型元素的集合,这些元素在内存中连续存储。通过数组,我们可以用一个统一的名字来管理一组相关的数据,并且通过下标(索引)快速访问其中的每一个元素。例…...

ADVB协议同步

关于视频传输,有多种控制时序。协议标准允许设计者选择有限的几个速率的接口来满足 系统设计目标。例如,一些系统使用总线时序发送信息通过line-by-line;在这个案例中, 容器的sof作为vsync同步的点。horizontal line blanding将插入idles,ADV…...

基于LAB颜色空间的增强型颜色迁移算法

本文算法使用Grok完成所有内容,包含算法改进和代码编写,可大大提升代码编写速度,算法改进速度,提供相关idea,提升效率; 概述 本文档描述了一种基于LAB颜色空间的颜色迁移算法,用于将缩略图D的…...

复合材料高置信度 DIC 测量与高级实验技术研讨会邀请函

邀请函 2025年5月8日 上海 中国复合材料学会官网会议通知 您可以点击上方蓝字跳转官网查看官网信息 主办单位: 中国复合材料学会 协办单位: 研索仪器科技(上海)有限公司 数字图像相关技术(Digital Image Correla…...

解决docker部署MySQL的max_allowed_packet 限制问题

报错 Error querying database. Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (2,471 > 2,048). You can change this value on the server by setting the max_allowed_packet variable. ### The error may exist in file …...

【XR手柄交互】Unity 中使用 InputActions 实现手柄控制详解(基于 OpenXR + Unity新输入系统(Input Actions))

摘要: 本文主要介绍如何使用 Input Actions(Unity 新输入系统) OpenXR 来实现 VR手柄控制(监听ABXY按钮、摇杆、抓握等操作)。 🎮 Unity 中使用 InputActions 实现手柄控制详解(基于 OpenXR 新…...

C++:继承机制详解

目录 一.继承的概念及定义 一).继承的概念 二).继承定义 1.定义格式 2.继承类型 3.继承类模板 二.基类和派生类间的转换 三.继承中的作用域 四.派生类的默认成员函数 一).4个常见默认成员函数 二).不可被继承的类 五…...

自然语言处理+知识图谱:智能导诊的“大脑”是如何工作的?

智能导诊系统定义与作用 智能导诊系统是一种基于人工智能技术的医疗辅助工具,旨在提高医疗服务效率、改善患者就医体验、降低医院运营成本,通过自然语言处理技术,智能导诊系统能够自动回答患者的常见问题,帮助患者快速了解自己的…...

论文阅读笔记——ZeroGrasp: Zero-Shot Shape Reconstruction Enabled Robotic Grasping

ZeroGrasp 论文 多视角重建计算大、配置复杂,本文将稀疏体素重建(快且效果好)引入机器人抓取且只考虑单目重建,通过利用基于物理的接触约束与碰撞检测(这对精确抓取至关重要),提升三维重建质量将…...

Qt 调试信息重定向到本地文件

1、在Qt软件开发过程中,我们经常使用qDebug()输出一些调试信息在QtCreator终端上。 但若将软件编译、生成、打包为一个完整的可运行的程序并安装在系统中后,系统中没有QtCreator和编译环境,那应用程序出现问题,如何输出信息排查…...

Android Studio开发中Application和Activity生命周期详解

文章目录 Application生命周期Application生命周期概述Application关键回调方法onCreate()onConfigurationChanged()onLowMemory()onTrimMemory()onTerminate() Application生命周期管理最佳实践 Activity生命周期Activity生命周期概述Activity生命周期回调方法onCreate()onSta…...

vite+vue2+elementui构建之 package.json

webpack版本太低,构建依赖太多,头大。 各种查阅资料,弄了一份直通构建vite构建elementUi核心文件, 构建基于开源若依vue2vue3版本改造,感谢开源,感谢若依。 vitevue2elementui构建之 vite.config.js-CSD…...

安全编排自动化与响应(SOAR):从事件响应到智能编排的技术实践

安全编排自动化与响应(SOAR):从事件响应到智能编排的技术实践 在网络安全威胁复杂度指数级增长的今天,人工处理安全事件的效率已难以应对高频攻击(如日均万级的恶意IP扫描)。安全编排自动化与响应&#xf…...

《Keras 3 :使用 TFServing 提供 TensorFlow 模型》

《Keras 3 :使用 TFServing 提供 TensorFlow 模型》 作者:Dimitre Oliveira 创建日期:2023/01/02 最后修改时间:2023/01/02 描述:如何使用 TensorFlow Serving 为 TensorFlow 模型提供服务。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 介绍 构建机器学习模…...

深入理解C++ 中的list容器

目录 一、引言 二、list的基本介绍 2.1 底层结构 2.2 特性 三、list的使用 3.1 构造函数 3.2 迭代器的使用 3.3 容量相关操作 3.4 元素访问相关操作 3.5 修改器操作 3.6 迭代器失效问题 四、list的模拟实现 4.1 节点定义 4.2 迭代器实现 4.3 list类实现 五、lis…...

附赠二张图,阐述我对大模型的生态发展、技术架构认识。

文章精炼,用两张图说明大模型发展业态方向,以及大模型主体技术架构。(目前还需要进一步验证我的Thought && ideas,等待机会吧.........) 图一:探究大模型三个层次应用方向,浅层次入门简…...

Java实现加密(七)国密SM2算法的签名和验签(附商用密码检测相关国家标准/国密标准下载)

目录 一、国密标准中,关于SM2签名验签的定义二、SM2签名和验签的实现原理1. 前置知识2. 签名生成过程3. 验签过程4. 数学正确性证明5. 安全性与注意事项 三、带userId、不带userId的区别1. 核心区别2.算法区别(1) 哈希计算过程(2) 签名验签流程 四、Java代码实现1. …...

贪心算法~~

目录 一、理论基础 二、题目练习 (1)455. 分发饼干 (2)53. 最大子数组和 - 力扣 (3)122. 买卖股票的最佳时机 II - 力扣(LeetCode) (4)860. 柠檬水找零…...

XYNU2024信安杯-REVERSE(复现)

前言 记录记录 1.Can_you_find_me? 签到题,秒了 2.ea_re 快速定位 int __cdecl main_0(int argc, const char **argv, const char **envp) {int v4; // [esp0h] [ebp-1A0h]const char **v5; // [esp4h] [ebp-19Ch]const char **v6; // [esp8h] [ebp-198h]char v7;…...

NLP系列【自然语言处理的深度学习模型综述】

自然语言处理的深度学习模型 摘要传统自然语言处理模型(略 不作重点)神经网络自然语言处理模型经典神经网络CNN网络模型Word2Vec模型RNN模型GPT网络模型BERT网络模型 BERT变体模型提升模型性能模型压缩 摘要 在自然语言处理任务方面,依据语料…...

【差分隐私】basic primitive的含义

在差分隐私领域,“basic primitive”一词具有特定的技术含义,需从单词本义及学科背景两个层面解析: 一、单词本义解析 “Primitive”在计算机科学中通常指代基础构建单元或核心组件,例如编程语言中的基本数据类型(如整…...

数字浪潮下的算力担当:GPU 服务器的多元应用、核心价值

在当今数据洪流和信息爆炸的时代,算力已成为衡量国家、行业乃至企业发展水平的关键指标。而算力服务器,特别是 GPU 服务器,作为算力的核心载体,正以其卓越性能深刻改变着世界的运行逻辑与模式。从数据处理到云计算,从人…...

【Echarts】使用echarts绘制多个不同类型的中国地图

一、需求 在同一页面上绘制多个不同类型的中国地图,如果是在同一页面上绘制多个同一种类型的地图可以直接引用一个china.js文件,设置两个独立的div分别用于放置两个地图,并实例化配置相关参数即可,但是如果在同一个页面上绘制多个…...

WEB漏洞-XSS跨站原理分类

本文主要内容 原理 XSS漏洞产生原理? XSS漏洞危害影响? 分类 反射型、存储型、DOM型 手法 XSS平台使用 XSS工具使用 XSS结合其他漏洞 靶场搭建 pikachu 靶场搭建(完整版)-CSDN博客https://blog.csdn.net…...

PR第二课--混剪

1.音乐打点 1.1 手动打点 按钮(如图),或者,快捷键M(如果在已有打点处,再次按M键会进入对标记点的设置界面,如下下图) 1.2 插件打点 一段音乐中,有明显的鼓点时,可以使用打点插件,快捷打点;如果鼓点不明显的话,最好还是手动打点,用插件打点会打出大量的标记点,…...

Kafka和flume整合

需求1:利用flume监控某目录中新生成的文件,将监控到的变更数据发送给kafka,kafka将收到的数据打印到控制台: 在flume/conf下添加.conf文件, vi flume-kafka.conf # 定义 Agent 组件 a1.sourcesr1 a1.sinksk1 a1.c…...

Linux 内核网络协议栈中 inet_stream_ops 与 tcp_prot 的深度解析

在 Linux 内核网络协议栈中,TCP 协议的实现依赖于多个关键结构体的协作。其中,inet_stream_ops 和 tcp_prot 是两个核心结构体,它们分别属于不同的层次,共同完成从用户态系统调用到底层协议处理的完整链路。本文将从功能定位、协作关系、代码示例及设计哲学等方面,深入分析…...

flume整合kafka

需求一: 启动flume 启动kafka消费者,验证数据写入成功 新增测试数据 需求二: 启动Kafka生产者 启动Flume 在生产者中写入数据...

EasyRTC音视频实时通话嵌入式SDK,打造社交娱乐低延迟实时互动的新体验

一、方案背景 在数字化时代,社交娱乐已经成为人们生活中不可或缺的一部分。随着移动互联网和智能设备的普及,用户对实时互动的需求越来越高。EasyRTC作为一款基于WebRTC技术的实时音视频通信解决方案,凭借其低延迟、高稳定性和跨平台兼容性&…...

制作一款打飞机游戏21:自定义工具

关于如何在Pico 8中创建我们自己的编辑器。 外部编辑器的需求 首先,我想谈谈为什么我们需要外部编辑器。外部编辑器通常用于编辑游戏中的数据。例如,一个游戏卡或程序通常包含一些代码,但也会包含数据,比如静态信息,…...

面向高性能运动控制的MCU:架构创新、算法优化与应用分析

摘要:现代工业自动化、汽车电子以及商业航天等领域对运动控制MCU的性能要求不断提升。本文以国科安芯的MCU芯片AS32A601为例,从架构创新、算法优化到实际应用案例,全方位展示其在高性能运动控制领域的优势与潜力。该MCU以32位RISC-V指令集为基…...

LWIP中两种重要的数据结构pbuf和pcb详细介绍

LWIP(Lightweight IP)是为嵌入式系统设计的轻量级TCP/IP协议栈。pbuf(Packet Buffer)和PCB(Protocol Control Block)是LwIP中两个核心数据结构,分别负责数据包管理和协议状态维护。 1. pbuf&…...

embedding_model模型通没有自带有归一化层该怎么处理?

embedding_model 是什么: 嵌入式模型(Embedding)是一种广泛应用于自然语言处理(NLP)和计算机视觉(CV)等领域的机器学习模型,它可以将高维度的数据转化为低维度的嵌入空间&#xff0…...