RabbitMQ如何保证消息不丢失?
在RabbitMQ中,消息丢失可能发生在三个阶段:生产者发送消息时、消息在RabbitMQ服务器内部传递时、消费者接收消息时。为了保证消息不丢失,需要从这三个方面分别采取措施:
1. 生产者确保消息发送成功
- 开启确认模式(Confirm Mode):生产者通过调用
channel.confirmSelect()
方法开启确认模式。在这种模式下,当生产者发送消息后,RabbitMQ会向生产者发送一个确认消息,告知生产者该消息是否成功到达服务器。
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.ConfirmListener;public class Producer {private final static String QUEUE_NAME = "test_queue";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);channel.confirmSelect();// 开启发送确认机制channel.addConfirmListener(new ConfirmListener() {@Overridepublic void handleAck(long deliveryTag, boolean multiple) throws Exception {System.out.println("消息已确认送达,deliveryTag: " + deliveryTag + (multiple? ",多个消息" : ""));}@Overridepublic void handleNack(long deliveryTag, boolean multiple) throws Exception {System.out.println("消息未送达,deliveryTag: " + deliveryTag + (multiple? ",多个消息" : ""));// 添加消息重发逻辑,记录日志信息}});String message = "Hello, RabbitMQ!";channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF - 8"));}}
}
- 事务机制:生产者可以通过
channel.txSelect()
方法开启事务。发送消息前开启事务,发送消息后提交事务,如果发送过程中出现异常则回滚事务。但是事务机制会严重影响RabbitMQ的性能,因为它是同步阻塞的,不建议在高并发场景下使用。
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class ProducerWithTx {private final static String QUEUE_NAME = "test_queue";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);channel.txSelect();String message = "Hello, RabbitMQ!";channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF - 8"));channel.txCommit();} catch (Exception e) {// 如果出现异常,回滚事务if (channel != null) {try {channel.txRollback();} catch (Exception ex) {ex.printStackTrace();}}e.printStackTrace();}}
}
2. RabbitMQ服务器保证消息存储安全
- 持久化设置:
- 交换机持久化:通过
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true);
声明交换机时设置durable=true
- 队列持久化:通过
channel.queueDeclare(queueName, true, false, false, null)
方法声明队列时,将第二个参数设为true
,这样队列在服务器重启后依然存在。 - 消息持久化:通过
channel.basicPublish("", queueName, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes("UTF - 8"))
方法发送消息时,将第三个参数设为MessageProperties.PERSISTENT_TEXT_PLAIN
,这样消息会被持久化到磁盘。即使RabbitMQ服务器崩溃重启,持久化的消息和队列也不会丢失。
- 交换机持久化:通过
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;public class PersistentMessageSender {private final static String EXCHANGE_NAME = "persistent_exchange";private final static String QUEUE_NAME = "persistent_queue";private final static String ROUTING_KEY = "persistent_key";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 声明持久化交换机channel.exchangeDeclare(EXCHANGE_NAME, "direct", true);// 声明持久化队列channel.queueDeclare(QUEUE_NAME, true, false, false, null);// 将队列绑定到交换机channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);String message = "这是一条持久化消息";// 发送持久化消息channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY,MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes("UTF - 8"));System.out.println(" [x] Sent '" + message + "'");}}
}
3. 消费者确保消息正确接收
- 设置手动确认(Manual Acknowledgment):消费者通过
channel.basicConsume(queueName, false, consumerTag, false, false, null, consumer)
方法消费消息时,将第二个参数设为false
,表示关闭自动确认模式,开启手动确认。当消费者成功处理完消息后,调用channel.basicAck(deliveryTag, false)
方法向RabbitMQ服务器发送确认消息。如果消费者在处理消息过程中出现异常,没有发送确认消息,RabbitMQ会认为该消息没有被成功消费,会将其重新放入队列,分配给其他消费者(如果有多个消费者)或在下次消费者启动时重新分配给该消费者。
public class Consumer {private final static String QUEUE_NAME = "test_queue";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);boolean autoAck = false; // 关闭自动确认,改为手动确认channel.basicConsume(QUEUE_NAME, autoAck, "myConsumerTag",false, false, null, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body) throws IOException {String message = new String(body, "UTF - 8");System.out.println("收到消息: '" + message + "'");// 模拟消息处理try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}channel.basicAck(envelope.getDeliveryTag(), false);}});}}
}
- 消费端重试机制
- 处理失败时记录日志并重试
- 达到最大重试次数后转入死信队列
public class MessageConsumerWithRetryAndDLX {private final static String QUEUE_NAME = "main_queue";private final static String DLX_EXCHANGE_NAME = "dlx_exchange";private final static String DLX_QUEUE_NAME = "dlx_queue";private static final int MAX_RETRIES = 3;public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 声明死信交换机channel.exchangeDeclare(DLX_EXCHANGE_NAME, "direct", true);// 声明死信队列channel.queueDeclare(DLX_QUEUE_NAME, true, false, false, null);channel.queueBind(DLX_QUEUE_NAME, DLX_EXCHANGE_NAME, "dlx_routing_key");// 声明主队列,并设置死信交换机和路由键Map<String, Object> args = new HashMap<>();args.put("x - dead - letter - exchange", DLX_EXCHANGE_NAME);args.put("x - dead - letter - routing - key", "dlx_routing_key");channel.queueDeclare(QUEUE_NAME, true, false, false, args);boolean autoAck = false; // 关闭自动确认channel.basicConsume(QUEUE_NAME, autoAck,"myConsumerTag", false, false, null,new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body) throws IOException {String message = new String(body, "UTF - 8");System.out.println(" [x] Received '" + message + "'");int retryCount = getRetryCount(properties);boolean success = processMessage(message, retryCount);if (success) {channel.basicAck(envelope.getDeliveryTag(), false);} else {if (retryCount < MAX_RETRIES) {// 重试,重新入队消息AMQP.BasicProperties newProps = properties.builder().headers(getUpdatedHeaders(retryCount)).build();channel.basicPublish("", envelope.getRoutingKey(), newProps, body);channel.basicAck(envelope.getDeliveryTag(), false);} else {// 达到最大重试次数,转入死信队列channel.basicPublish(DLX_EXCHANGE_NAME, "dlx_routing_key", properties, body);channel.basicAck(envelope.getDeliveryTag(), false);System.out.println("达到最大重试次数,消息转入死信队列: " + message);}}}});}}private static int getRetryCount(AMQP.BasicProperties properties) {if (properties.getHeaders() == null ||!properties.getHeaders().containsKey("retryCount")) {return 0;}return (int) properties.getHeaders().get("retryCount");}private static boolean processMessage(String message, int retryCount) {// 模拟消息处理逻辑,这里简单抛出异常模拟处理失败try {if (message.contains("error")) {throw new RuntimeException("模拟处理失败");}System.out.println("消息处理成功: " + message);return true;} catch (Exception e) {System.out.println("消息处理失败: " + e);return false;}}private static Map<String, Object> getUpdatedHeaders(int retryCount) {Map<String, Object> headers = new HashMap<>();headers.put("retryCount", retryCount + 1);return headers;}
}
相关文章:
RabbitMQ如何保证消息不丢失?
在RabbitMQ中,消息丢失可能发生在三个阶段:生产者发送消息时、消息在RabbitMQ服务器内部传递时、消费者接收消息时。为了保证消息不丢失,需要从这三个方面分别采取措施: 1. 生产者确保消息发送成功 开启确认模式(Conf…...
RAG 的介绍及评价方法
RAG的作用 大模型虽然具备处理复杂语言任务的强大能力,但在知识更新和依赖外部信息的及时性方面存在局限。大模型在训练时捕获的知识通常是静态的,一旦训练完成,模型便不再更新,无法掌握训练数据集之外的最新信息或事件。RAG可以…...
Linux网络新手注意事项与配置指南
Linux系统在网络管理方面提供了丰富的工具和灵活的配置方式,但对于新手来说,掌握正确的操作方法和注意事项至关重要。本文将从网络基础概念、配置工具、安全设置、故障排查以及常见错误等多个方面,结合具体代码示例,详细讲解Linux网络管理的核心内容,帮助新手快速入门并避…...
CI/CD与DevOps流程流程简述(提供思路)
一 CI/CD流程详解:代码集成、测试与发布部署 引言 在软件开发的世界里,CI/CD(持续集成/持续交付)就像是一套精密的流水线,确保代码从开发到上线的整个过程高效、稳定。我作为一名资深的软件工程师,接下来…...
【AWS+Wordpress-准备阶段】AWS注册+创建EC2实例
前言 自学笔记,解决问题为主,亲测有效,欢迎补充。 本地WP文件部署到AWS整体步骤如下:(本文重点:AWS准备完成) 0. [AWS 准备] 注册 AWS 并创建 EC2 实例 ↓ 1. [生成安装包:用 Du…...
FPGA----基于ZYNQ 7020实现定制化的EPICS通信系统
引言:前文我们降到了,使用alinx提供的sd卡,直接在上面编译即可。那么,如果我们的在FPGA侧有一些个性化的开发,那么生成的image.ub和boot.bin将于原sd卡中的不一致,我们应该如何坐呢? 补充知识点…...
读《暗时间》有感
读《暗时间》有感 反思与笔记 这本书还是我无意中使用 ima 给我写职业规划的时候给出的,由于有收藏的习惯,我就去找了这本书。当读到第一章暗时间的时候给了我很大的冲击,我本身就是一个想快速读完一本书的人,看到东西没有深入思…...
MIT关节电机相序校准
UVW三相相序判断 电机相序校正是确保多关节控制系统正常运行的重要步骤。在实际应用中,每个电机定子的三相线(W、U、V)的连接顺序可能存在差异,这是由于制造过程中的随机接线所致。不过,通过简单的校正方法,…...
Qwen2.5模型结构
self.lm_head nn.Linear(config.hidden_size, config.vocab_size, biasFalse) 这个是用来干嘛的 输出层,词汇投影层,将模型输出的隐藏状态向量映射回词表空间,用于预测下一个token # 预测 logits,未经过 softmax lm_logits self…...
2021-11-11 C++泰勒sin(x)以2步进乘方除以阶乘加减第N项
缘由c书本题,求解了,求解-编程语言-CSDN问答 int n 10, d 3, z -1; double x 2.5, xx x;while (n){xx (乘方(x, d) / 阶乘(d)) * z;d 2, --n, z * -1;}std::cout << xx << std::endl;...
【MySQL】C语言访问数据库
C语言访问数据库 一. Linux 安装 MySQL 动静态库二. 使用MySQL数据库1. 创建MySQL对象2. 连接MySQL数据库3. 释放MySQL对象4. SQL 语句操作1. 插入操作2. 修改操作3. 删除操作4. 查询操作 准备工作 use mysql; select user, host from user;# 创建本地连接的用户 create user c…...
dify 部署后docker 配置文件修改
1:修改 复制 ./dify/docker/.env.example ./dify/docker/.env 添加一下内容 # 启用自定义模型 CUSTOM_MODEL_ENABLEDtrue# 将OLLAMA_API_BASE_URL 改为宿主机的物理ip OLLAMA_API_BASE_URLhttp://192.168.72.8:11434# vllm 的 OPENAI的兼容 API 地址 CUSTOM_MODE…...
【神经网络与深度学习】VAE 和 GAN
这位大佬写的 VAE 的讲解很不错 VAE 和 GAN 的相同点和不同点 引言 VAE(变分自编码器)和 GAN(生成对抗网络)是深度学习中两种主要的生成模型,它们在数据生成任务中发挥着重要作用。虽然它们的目标相似,都…...
2-C#控件
2-控件 1.panel控件的使用 private void button3_Click(object sender, EventArgs e){Form2 my2 new Form2();my2.TopLevel false;this.panel1.Controls.Add(my2);my2.BringToFront();my2.Show();}private void button4_Click(object sender, EventArgs e){Form3 my3 new F…...
1.1.2 简化迭代器 yield return的使用
yield return 是一个用于简化迭代器(Iterator)实现的关键字组合。它的核心作用是让开发者能够以更简洁的方式定义一个按需生成序列的方法(生成器方法),而无需显式实现 IEnumerable 或 IEnumerator 接口。yield return …...
机器学习实操 第二部分 神经网路和深度学习 第14章 使用卷积神经网络进行深度计算机视觉
机器学习实操 第二部分 神经网路和深度学习 第14章 使用卷积神经网络进行深度计算机视觉 内容概要 第14章深入探讨了卷积神经网络(CNNs)及其在计算机视觉中的应用。CNNs受大脑视觉皮层的启发,通过局部感受野和权值共享机制,能够…...
电商双11美妆数据分析(2)
接下来用seaborn包给出每个店铺各个大类以及各个小类的销量销售额 关于性别 接下来考虑性别因素,了解各类产品在男性消费者中的销量占比 男士的销量基本来自于清洁类,其次是补水类。而这两类正是总销量中占比最高的两类。 非男士专用中,补水…...
数字康养新范式:七彩喜平台重构智慧养老生态的深度实践
在全球人口老龄化程度日益加深的当下,养老问题成为社会关注的焦点。 智慧养老作为一种创新的养老模式,借助现代信息技术,为提升老年人生活质量、缓解养老压力提供了新的思路与途径。 而当前中国 60 岁以上人口已达 2.8 亿,占总人…...
2D横板跳跃游戏笔记(查漏补缺ing...)
1.Compression(压缩质量):可以改为None,不压缩的效果最好,但占用内存 2.Filter Mode(过滤模式):可以选择Point(no filter) 3.Pixels Per Unit:是…...
c++中“”符号代表引用还是取内存地址?
c中,“&”符号有时代表引用,有时代表取地址符。 一、引用和取址 引用是一个已存在变量的别名,修改别名的值,原始变量的值也会改变;而取地址符则是得到一个指针,该指针指向变量的内存地址。 1&#x…...
AGV智能搬运机器人:富唯智能引领工业物流高效变革
在智能制造与工业4.0深度融合的今天,物流环节的高效与精准已成为企业核心竞争力的关键。富唯智能凭借其自主研发的AGV智能搬运机器人,以创新技术重塑工业物流标准,助力企业实现降本增效的跨越式发展。 一、技术突破:精准导航与智能…...
今年中国新能源汽车销量已破400万辆 大增42%
快科技5月7日消息,乘联分会公布了2025年4月新能源乘用车厂商批发销量数据。 纵观2025年以来,综合预估今年1-4月累计批发400万辆,同比增长42%。 根据中汽协发布的数据,2024年中国新能源汽车市场产销两旺,全年累计销量…...
广告屏蔽插件的内部细节EasyList 规则详解:为什么广告屏蔽不直接用 CSS/JS?(彩蛋)
广告屏蔽插件的内部细节:EasyList 规则详解;为什么广告屏蔽不直接用 CSS/JS屏蔽广告? 我们经常在浏览器中使用一些广告屏蔽插件(如 uBlock Origin、AdGuard、AdBlock Plus)已经成为许多用户的必备插件。 刚开…...
TCGA数据库临床亚型可用!贝叶斯聚类+特征网络分析,这篇 NC 提供的方法可以快速用起来了!
生信碱移 贝叶斯网络聚类 CANclust是一种基于贝叶斯的聚类方法,系统性地对基因突变、细胞遗传学信息和临床指标进行联合建模,用于多种模态数据的联合聚类分析,并识别在患者群体中反复出现的特征模式。 个体的遗传与环境背景决定其应对疾病的…...
好的软件系统
一个“好的软件系统”通常具有以下几个核心特征,简洁来说就是:“能用、好用、易维护、可扩展、安全可靠”。 一个好的软件系统,不只是“能跑起来”,而是“跑得稳、跑得快、跑得久,而且随时能换赛道还能继续跑 高内聚2.…...
某大型交通规划设计院转型实践:数智化破局复杂工程项目管理,实现高效人力资源一体化管理
随着中国经济的快速发展及基础设施建设的不断推进,交通规划设计行业正迎来新的机遇与挑战。作为行业的标杆企业,某大型交通规划设计院(以下简称G院)自1952年成立以来,始终致力于为公路、市政、建筑、园林规划等领域提供…...
格雷狼优化算法`GWO 通过模拟和优化一个信号处理问题来最大化特定频率下的功率
这段代码是一个Python程序,它使用了多个科学计算库,包括`random`、`numpy`、`matplotlib.pyplot`、`scipy.signal`和`scipy.signal.windows`。程序的主要目的是通过模拟和优化一个信号处理问题来最大化特定频率下的功率。 4. **定义类`class_model`**: - 这个类包含了信号…...
react中的用法——setDisabled dva dispatch effects
setDisabled 在react中,setDisabled通常是指通过状态管理来控制某个组件(如按钮、输入框等)的禁用状态。虽然react本身没有内置的setDisabled方法,但你可以使用useState钩子来实现类似的功能。以下是一个简单的示例,展…...
深入解析华为交换机中的VRRP原理
在现代网络架构中,高可用性和冗余性是确保网络稳定运行的关键因素。虚拟路由冗余协议(VRRP)作为一种广泛应用的冗余协议,能够有效地提升网络设备的可用性。特别是在华为交换机中,VRRP的实现为网络提供了更强大的灵活性…...
优艾智合CEO张朝辉荣膺U45杰出青年企业家
2025年是深圳经济特区成立45周年,也是深商会成立20周年。适逢五四青年节来临,深商总会、深圳市商业联合会、深圳市老字号协会、深圳市中小企业公共服务联盟、香港大湾区工商业联合会、广东省粤港澳大湾区产业协同发展联合会、深圳市深商公益基金会、深圳…...
解决HomeAssistant 无法安装 samba share问题
最近家里树莓派上的homeassistant 被折腾崩了,重新安装过程中发现加载项“Official add-ons”里面的“samba share”、“file edit”、“Mosquitto broker”等常用组件都不能安装。报以下错误: [supervisor.docker.interface] Cant install homeassista…...
【工具】HandBrake使用指南:功能详解与视频转码
HandBrake使用指南:功能详解与视频转码 一、前言 高清视频在当下日益普及,从影视制作到个人拍摄,从社交媒体发布到远程教育,如何高效地压缩、转换和管理视频文件的体积与清晰度,成为内容创作者与技术开发者的核心任务…...
代码随想录算法训练营第三十四天
LeetCode题目: 198. 打家劫舍213. 打家劫舍 II337. 打家劫舍 III3341. 到达最后一个房间的最少时间 I(每日一题) 其他: 今日总结 往期打卡 198. 打家劫舍 跳转: 198. 打家劫舍 学习: 代码随想录公开讲解 问题: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都…...
数字电子技术基础(五十五)——D触发器
1 D触发器 我们知道电平触发在CLK1、S1、R1的时候,有不确定的状态,输出会进入不稳定状态,这种情况下电路可能会导致逻辑错误,通过如果在时钟信号有效期间,如果S和R在此期间发生了多次变化,那么输出会随着发…...
Spark external shuffle service
yarn external shuffle service 参考链接: https://mp.weixin.qq.com/s/ZggMnX2r4uj8TrzUPTMLhQ shuffle过程包括shuffle read和shuffle write两个过程。对于spark on yarn,shuffle write是container写数据到本地磁盘(路径由core-site.xml中hadoop.tm…...
用 NGINX 打造高性能 FastCGI 加速 `ngx_http_fastcgi_module`
一、安装与启用 # 在编译 NGINX 源码时加上: ./configure --with-http_fastcgi_module make && sudo make install# 或确保你使用的二进制已内置(大多数发行版都默认包含) nginx -V | grep fastcgi二、基础转发配置 http {server {…...
penEuler操作系统结合豆包测试github仓库8086-Emulator项目
penEuler操作系统结合豆包测试github仓库8086-Emulator项目 8086-Emulator项目:https://github.com/YJDoc2/8086-Emulator 申请空间 首先在华为开发者空间申请一个免费云主机(penEuler操作系统):https://huaweicloud.csdn.net/…...
MapReduce中的分区器
在MapReduce框架中,分区器(Partitioner)是一个关键组件,其主要作用是决定由一个maptask生成的键值,最终是生成在哪个文件中的。 默认的分区器是HashPartitioner,它会根据键的哈希值将数据均匀分配到各个Red…...
【愚公系列】《Manus极简入门》024-表演艺术教练:“舞台魔法师”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
CentOS 系统升级失败的原因与排查
一、常见升级失败原因 1. 软件包依赖问题 循环依赖:软件包A依赖B,B又依赖A 版本冲突:新旧版本软件包不兼容 缺失依赖:所需依赖包未正确安装或不可用 2. 存储空间不足 /boot分区空间不足(常见于内核更新࿰…...
【useOperatorData Hook 改造实践】
useOperatorData Hook 改造实践 1. 背景 在我们的大屏项目中,运营商数据是一个核心的业务概念。几乎所有业务模块都需要根据当前选择的运营商来获取对应的数据。这就要求我们有一个统一的、可靠的方式来处理运营商相关的数据获取和状态变更。 1.1 原有实现 最初…...
vue3+ts的computed属性怎么用?
首先我们要进行引入computed这个属性,然后定义用这个属性的时候我们要先了解这个属性。 这个computed其实分为里两种!一种是仅可读的,还有一种就是即可以读,又可以修改的! 那我们常用的肯定是后者!我们引…...
游戏服务器怎么挑选细节与技巧深度解析
在开发或运营网络游戏时,选择合适的游戏服务器是决定游戏体验和运营成败的关键因素。本文将深入分析游戏服务器挑选的核心考量点和实用技巧。 一、基础架构选择 1. 服务器类型对比 类型物理服务器云服务器混合架构 优势完全控制权、高性能稳定弹性扩展、全球部署…...
ZYNQ笔记(十八):VDMA VGA彩条显示
版本:Vivado2020.2(Vitis) 任务:以 VDAM IP 为核心实现 VGA 彩条图像显示 (PS 端写入彩条数据到 DDR 通过 VDMA 读取出来输出给 VGA 进行显示) 目录 一、介绍 (1)AXI4-Stream Vide…...
MCU缓存架构设计与优化策略
MCU缓存设计通过优化指令与数据的访问效率来提升系统性能并降低功耗。其核心架构包括指令缓存(I-Cache)和数据缓存(D-Cache),I-Cache用于缓存从Flash或外部存储器读取的指令,减少CPU等待时间,适…...
制作一款打飞机游戏39:鼠标控制
绘制敌人指示器 接下来,我想在时间线上绘制敌人指示器,以便更直观地看到敌人的生成情况。我调整了指示器的位置,使其与界面上的按钮相匹配。这虽然增加了一些工作量,但也让界面看起来更加整洁。 解决敌人重叠问题 然而…...
【LUT技术专题】基于扩展卷积的极快速LUT算法
ECLUT:Efficient Look-Up Table from Expanded Convolutional Network for Accelerating Image Super-resolution(2024 AAAI) 专题介绍一、研究背景二、ECLUT方法2.1 EC模块2.2 ECConv感受野的分析2.3 放缩系数α 三、实验结果四、总结 本文将…...
1.3 Expression.Lambda表达式树的介绍
在 C# 中,几乎所有东西都是表达式,比如: 1). 3是常量表达式 : Expression.Constant 2). x,y是变量表达式:Expression.Parameter(typeof(变量类型), 变量名称); 3). !a 一元表达式 4). a+b 二元表达式, 比如Expression.Add 5).Math.Sin(x) 方法调用表达式, Expre…...
cursor配置mcp并使用
确保在本地安装了Node.js(包含 npm),下载地址:Node.js — Run JavaScript Everywhere 检查是否安装成功 node -v npm -v项目配置: 在项目目录中创建一个 .cursor/mcp.json文件 server与clients的地址:MC…...
基于条件随机场(CRF)的词性标注实践探索
在自然语言处理领域,词性标注是一项基础且关键的任务,它能够为后续的语义分析、句法分析等工作奠定坚实基础。条件随机场(Conditional Random Field,CRF)作为一种强大的概率图模型,在词性标注等序列标注任务…...