RabbitMQ 优先级队列详解
本文是博主在记录使用 RabbitMQ 在执行业务时遇到的问题和解决办法,因此查阅了相关资料并做了以下记载,记录了优先级队列的机制和使用要点。
本文为长文,详细介绍了相关的知识,可作为学习资料看。
文章目录
- 一、优先级队列介绍
- 1、消息是在入优先级队列时排序,还是等消费者拉取消息时排序?
- 1.1 消息入队列立即排序,即先排序
- 1.2 优先级队列通常遵循以下原则
- 2、高优先级消息源源不断,优先级队列如何处理低优先级消息?
- 2.1 时间衰减机制(Aging)
- 2.2 分层队列 + 比例调度
- 2.3 动态优先级调整
- 2.4 容量限制与降级
- 2.5 空闲时段处理
- 3、优先级参数是声明队列的时候设置,还是在发送消息时设置?
- 3.1 声明队列时:启用优先级支持
- 3.2 发送消息时:指定消息优先级
- 3.3 优先级规则
- 3.4 完整流程示例
- 步骤 1:声明支持优先级的队列
- 步骤 2:发送带优先级的消息
- 步骤 3:消费者验证优先级
- 二、优先级队列的常见问题和最佳实践
- 1、常见问题与解决方案
- 2、使用优先级队列的最佳实践
- 3、普通队列变成优先级队列会导致已有消息丢失
- 4、要注意优先级队列的《预计取数》设置
- 5、多个消费者消费一个队列,优先级消息如何分配?
- 三、Java 示例实现优先级队列
- 1、添加 Maven 依赖
- 2、完整 Java 代码实现
- 3、关键代码解释
- 3.1 声明优先级队列
- 3.2 发送优先级消息
- 3.3 消费消息
- 4、运行与验证
- 5、参数设置
- 6、异常处理
- 7、多线程消费
一、优先级队列介绍
首先我们要知道,RabbitMQ 是一个消息中间件,支持多种消息队列模式,而优先级队列就是其中一种,优先级队列允许不同优先级的消息被存储,高优先级
的消息会被 先消费
。
- 配置队列的优先级范围比较常见的是例如
0 ~ 255
之间的数值,数值越大优先级越高
。 - 优先级的配置时机是在生产者在发送消息时,消费者在处理时,队列会按优先级顺序传递消息。
上面标黄的这句话会引出一个新的问题,比如,优先级队列如何影响消息的排序?如果队列已经有消息了,新来的高优先级消息会插到前面吗?或者只在消费者获取消息的时候才按优先级排序?
1、消息是在入优先级队列时排序,还是等消费者拉取消息时排序?
我们知道优先级队列和普通队列不同,普通队列是先进先出(FIFO),而优先级队列会根据消息的优先级来决定处理顺序。
假设队列中已经有三个消息,优先级分别为1、2、3(假设数字越大优先级越高),顺序是按照到达时间排列的。现在来了一条优先级为4的新消息,会引发先排序还是后排序的问题。
(1)先排序:消息入队列立即排序
消息到达队列先排序,立即将这条优先级为 4 的新消息插入到最前面,消费者直接获取优先级最高的消息。
- 能做到消费者每次取消息时不需要额外的排序开销。
- 队列内部的结构需要支持快速插入和删除,以保持消息的有序性,如
二叉堆结构
。
(2)后排序:消费者拉消息时排序
消息先入队列,消费者来取的时候,队列会按照优先级顺序将消息提供给消费者。
- 消费者拉取消息时排序,需要一个能快速查找最高优先级消息的结构,
如堆(heap)
。
上面两种做法大家可以思考一下优缺点。
1.1 消息入队列立即排序,即先排序
优先级队列通常会在消息入队时根据其优先级插入到正确的位置,而不是等到消费者获取时才进行排序。
该方式可以确保消费者每次获取到的都是当前队列中优先级最高的消息,而不需要每次消费时都重新排序整个队列。
因此,当一个新的高优先级消息到达时,它会被立即插入到队列中比它优先级低的消息前面,这样在后续的消费过程中,消费者会优先处理这条高优先级的消息。
1.2 优先级队列通常遵循以下原则
- 入队时排序:大多数消息队列系统(如RabbitMQ)在消息入队时即根据优先级调整顺序。新到达的高优先级消息会立即插入到队列中合适的位置(如前面),而非等待消费者拉取时才排序。这意味着队列内部始终按优先级维护有序状态。
- 数据结构支持:队列通常使用 堆(Heap) 或类似结构,确保插入和提取最高优先级消息的时间复杂度为
O(log n)
。例如,新消息D(优先级4)到达后,会被插入到比现有消息更高优先级的位置。 - 消费者行为透明:消费者获取消息时,无需感知排序过程,直接按队列现有顺序取出最高优先级的消息。队列在入队时已完成排序,因此消费时无额外开销。
示例场景:
现有队列:消息A(1)、B(2)、C(3)→ 顺序为 A → B → C(假设数字越大优先级越高)。
新消息D(4)到达 → 队列调整为 D(4)→ C(3)→ B(2)→ A(1)。
消费者下次获取时,直接取出D。
- 优势:提前排序确保消费效率,避免每次拉取时计算。
- 限制:高频插入高优先级消息可能导致调整成本增加,但通常影响可控。
注意:RabbitMQ 的优先级队列有一个最大优先级的限制(0到255),并且如果队列中已经有大量消息,插入一个高优先级消息可能会导致性能问题,因为它需要调整内部结构。
2、高优先级消息源源不断,优先级队列如何处理低优先级消息?
在了解了消息如何入队列之后,就会紧接着遇到下一个问题,高优先级的消息一直进来,队列可能会一直优先处理这些高优先级的,导致低优先级的消息被 饿死
,也就是永远得不到处理。这时候我们需要考虑怎么让低优先级的消息也能有机会被处理到。
2.1 时间衰减机制(Aging)
- 原理:动态提升长时间未处理消息的优先级。
- 实现:为每个消息记录等待时间(如时间戳)。
- 定义优先级增长函数(如线性增长
新优先级 = 原优先级 + k*等待时间
)。 - 定期扫描队列,更新低优先级消息的权重。
- 效果:避免低优先级任务无限期等待,平衡公平性。
2.2 分层队列 + 比例调度
- 原理:通过多级队列和固定比例分配资源。
- 实现:将队列分为高、中、低三级,按比例分配处理机会,如
3:2:1
。 - 使用加权轮询(WRR)或赤字轮询(DRR)算法调度。
- 示例:网络
QoS
中为不同流量类型分配带宽。(自行查阅)
2.3 动态优先级调整
- 原理:根据系统负载动态调整优先级策略。
- 实现:监控队列深度和处理延迟,当高优先级队列超过阈值时,临时提升低优先级任务的权重。
- 结合反馈控制(如PID控制器)自动调整参数。
- 场景:实时系统在过载时降级非关键任务。
2.4 容量限制与降级
- 原理:限制高优先级队列容量,强制资源释放。
- 实现:设置高优先级队列的最大长度(如1000条),超出容量后,新到的高优先级消息降级为中等优先级。
- 结合断路器模式拒绝过量请求。
- 优势:防止高优先级洪泛导致系统崩溃。
2.5 空闲时段处理
- 原理:利用系统空闲时间处理积压任务。
- 实现:定义空闲检测机制,如
CPU利用率 < 20% 持续 5 秒
,触发后台线程批量处理低优先级队列。 - 结合预取和缓存优化处理效率。
- 案例:数据库在低峰期执行维护任务。
常见的策略都在上面展示出来了,如果可以跟据业务需求进行调整,选择其中的一种或者组合使用。在使用的过程中要注意好如何权衡与优化。
- 公平性 vs 吞吐量:严格按优先级排序最大化吞吐量,但需牺牲公平性;引入Aging或分层队列可改善公平性。
- 实时性要求:硬实时系统可能需要绝对优先级,而软实时系统可结合超时重试机制。
- 监控与调优:跟踪低优先级任务的平均等待时间(如
Prometheus
监控),动态调整Aging因子和队列比例(如基于强化学习)。
常见的一些应用场景,可以根据示例搜索如何使用。
- 操作系统调度:
Linux CFS
调度器通过虚拟运行时间(vruntime)实现公平性。 - 消息队列系统:RabbitMQ 通过
x-max-priority
和插件支持优先级衰减。 - 微服务架构:
Envoy
网关通过流量优先级分级保障关键API
的SLA
。
通过上述策略的组合,系统能够在高负载下兼顾高优先级任务的及时处理和低优先级任务的最终可达性。
3、优先级参数是声明队列的时候设置,还是在发送消息时设置?
在 RabbitMQ 中,优先级队列的配置需要同时在声明队列时和发送消息时设置,二者缺一不可。
3.1 声明队列时:启用优先级支持
必须在队列声明阶段通过参数 x-max-priority
显式启用优先级功能,并定义优先级范围。
Map<String, Object> args = new HashMap<>();
args.put("x-max-priority", 10); // 定义优先级范围:0-10(共11级)
channel.queueDeclare("priority_queue", true, // 持久化队列false, false, args // 传入参数
);
注意事项
- 必须显式声明:如果队列未设置
x-max-priority
,发送消息时指定的优先级将被忽略。 - 取值范围:推荐值
0-10
,数值越高性能损耗越大(RabbitMQ 官方建议不超过 255)。 - 不可修改:已创建的队列无法动态修改优先级范围,需删除重建。
3.2 发送消息时:指定消息优先级
在消息属性中通过 priority
字段设置具体优先级值。
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().priority(7) // 设置优先级为7(需≤队列的x-max-priority).deliveryMode(2) // 持久化消息.build();channel.basicPublish("", "priority_queue", props, "消息内容".getBytes()
);
3.3 优先级规则
- 数值越大优先级越高:0 最低,最大值由
x-max-priority
决定。 - 自动截断:若消息优先级超过
x-max-priority
,会被截断为该最大值。 - 如队列声明
x-max-priority=5
,消息设置priority=8
会被视为 5。 - 默认优先级:未显式设置时,优先级为 0。
3.4 完整流程示例
步骤 1:声明支持优先级的队列
// 创建连接和Channel
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 定义优先级参数Map<String, Object> args = new HashMap<>();args.put("x-max-priority", 10);// 声明队列channel.queueDeclare("orders", true, // 持久化队列false, false, args);
}
步骤 2:发送带优先级的消息
// 发送高优先级订单消息
AMQP.BasicProperties highPriorityProps = new AMQP.BasicProperties.Builder().priority(8).build();
channel.basicPublish("", "orders", highPriorityProps, "VIP订单".getBytes());// 发送普通优先级消息(默认0)
channel.basicPublish("", "orders", null, "普通订单".getBytes());
步骤 3:消费者验证优先级
DeliverCallback callback = (consumerTag, delivery) -> {String msg = new String(delivery.getBody(), "UTF-8");int priority = delivery.getProperties().getPriority();System.out.println("收到优先级 " + priority + " 的消息: " + msg);channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
channel.basicConsume("orders", false, callback, consumerTag -> {});
二、优先级队列的常见问题和最佳实践
1、常见问题与解决方案
问题场景 | 原因 | 解决方案 |
---|---|---|
消息优先级未生效 | 队列未声明 x-max-priority | 删除旧队列,重新声明带优先级的队列 |
高优先级消息积压低优先级消息 | 持续高负载导致饥饿现象 | 结合时间衰减(Aging)机制提升老消息优先级 |
消费者未按优先级顺序处理消息 | 使用 basicConsume 自动分配消息 | 改用 basicGet 手动拉取消息并按优先级排序 |
优先级数值超过队列限制 | 生产者设置值 > x-max-priority | 在生产者端做优先级范围校验 |
消息顺序错乱 | 消费者使用了 prefetchCount > 1 ,导致低优先级消息被预取 | channel.basicQos(1); 每次只接收一条消息 |
2、使用优先级队列的最佳实践
- 限制优先级层级:建议使用 0-5 级,避免过多层级增加调度复杂度。
- 监控队列状态:通过 RabbitMQ Management Plugin 监控:
queue_messages_ready
(按优先级分组)message_age
(消息等待时间)
- 防御性设计:
// 生产者端校验优先级合法性 int safePriority = Math.min(requestedPriority, queueMaxPriority);
- 混合队列策略:
// 高、中、低优先级分队列处理 channel.queueDeclare("high_pri", true, false, false, Map.of("x-max-priority", 10)); channel.queueDeclare("low_pri", true, false, false, null); // 无优先级队列
3、普通队列变成优先级队列会导致已有消息丢失
如果在队列已经存在的情况下,修改 x-max-priority
参数会出现问题。
比如,原本队列没有设置优先级,后来想启用,可能需要重新声明队列,但这会导致已有的消息丢失。
4、要注意优先级队列的《预计取数》设置
优先级队列和消费者的 预取计数(prefetch count)
之间的关系。
- 如果消费者设置了较高的预取数,可能会一次性获取多个消息,这时候即使有更高优先级的消息到达,已经被预取的消息可能不会被中断,导致高优先级消息不能及时处理。
- 因此,可能需要合理设置预取数,或者使用
单条预取(prefetch=1)
来保证高优先级消息尽快被处理。
5、多个消费者消费一个队列,优先级消息如何分配?
如果有多个消费者,高优先级的消息会优先被哪个消费者获取?可能取决于消费者的空闲情况,但优先级高的消息会先被投递给空闲的消费者。
三、Java 示例实现优先级队列
1、添加 Maven 依赖
在 pom.xml
中添加 RabbitMQ Java 客户端依赖:
<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.12.0</version>
</dependency>
2、完整 Java 代码实现
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;public class PriorityQueueExample {private final static String QUEUE_NAME = "java_priority_queue";public static void main(String[] args) {// 创建生产者线程Thread producerThread = new Thread(() -> {try {sendMessages();} catch (IOException | TimeoutException e) {e.printStackTrace();}});// 创建消费者线程Thread consumerThread = new Thread(() -> {try {consumeMessages();} catch (IOException | TimeoutException e) {e.printStackTrace();}});producerThread.start();consumerThread.start();}/*** 生产者发送消息*/private static void sendMessages() throws IOException, TimeoutException {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 声明优先级队列参数Map<String, Object> args = new HashMap<>();args.put("x-max-priority", 10); // 设置最大优先级为10// 声明队列channel.queueDeclare(QUEUE_NAME, true, false, false, args);// 发送不同优先级的消息int[] priorities = {1, 3, 5};for (int priority : priorities) {String message = "Message with priority " + priority;// 设置消息属性(包含优先级)AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().priority(priority).build();channel.basicPublish("", QUEUE_NAME, props, message.getBytes());System.out.println("Sent: " + message);}}}/*** 消费者接收消息*/private static void consumeMessages() throws IOException, TimeoutException {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 定义消息回调处理DefaultConsumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) {String message = new String(body);int priority = properties.getPriority();System.out.println("Consumed: " + message + " | Priority: " + priority);}};// 开始消费(自动确认)channel.basicConsume(QUEUE_NAME, true, consumer);// 保持消费者线程运行try {Thread.sleep(5000); // 等待5秒确保消息处理完成} catch (InterruptedException e) {e.printStackTrace();} finally {channel.close();connection.close();}}
}
3、关键代码解释
3.1 声明优先级队列
Map<String, Object> args = new HashMap<>();
args.put("x-max-priority", 10); // 必须参数
channel.queueDeclare(QUEUE_NAME, true, false, false, args);
x-max-priority
:队列支持的最大优先级值(1-255)- 参数必须通过
Map<String, Object>
传递
3.2 发送优先级消息
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().priority(priority) // 设置优先级.build();
channel.basicPublish("", QUEUE_NAME, props, message.getBytes());
3.3 消费消息
DefaultConsumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) {int priority = properties.getPriority(); // 获取优先级}
};
4、运行与验证
- 启动生产者:发送优先级为 1、3、5 的消息
- 启动消费者:观察输出顺序应为
5 → 3 → 1
输出示例:
Sent: Message with priority 1
Sent: Message with priority 3
Sent: Message with priority 5
Consumed: Message with priority 5 | Priority: 5
Consumed: Message with priority 3 | Priority: 3
Consumed: Message with priority 1 | Priority: 1
5、参数设置
- 队列持久化:
channel.queueDeclare(..., true, ...)
中第二个参数表示队列持久化 - 消息持久化:通过
AMQP.BasicProperties.Builder().deliveryMode(2)
设置
6、异常处理
- 必须处理
IOException
和TimeoutException
- 使用 try-with-resources 自动关闭连接:
try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// ... }
7、多线程消费
- 如果启动多个消费者,高优先级消息会被空闲消费者优先获取
- 建议设置
prefetchCount=1
:单条预取channel.basicQos(1);
通过以上 Java 实现,可以完整地使用 RabbitMQ 的优先级队列功能。如果需要进一步优化,可以结合线程池、消息确认机制等扩展功能。
相关文章:
RabbitMQ 优先级队列详解
本文是博主在记录使用 RabbitMQ 在执行业务时遇到的问题和解决办法,因此查阅了相关资料并做了以下记载,记录了优先级队列的机制和使用要点。 本文为长文,详细介绍了相关的知识,可作为学习资料看。 文章目录 一、优先级队列介绍1、…...
串口通信简述
一.串口的特点 1.全双工异步通信 全双工指通信双方可以同时进行数据的发送和接收操作。 异步通信是指通信双方不使用共同的时钟信号来同步数据传输,而是通过特殊的信号或约定来标识数据的开始和结束 2.数据字长度可编程(8 位或 9 位) 不…...
【2025年五一数学建模竞赛A题】完整思路和代码
1.问题背景与重述 2.解题思路分析 2.1 问题一的分析 问题一假设无人机以平行于水平面的方式飞行并投放物资,可以将物资的运动 类比成平抛运动,由于物资的重量较大,因此不能简单的看成质点,还要考虑物资 的重量。 2.1.1本题要求给…...
为了四季度的盈利,李斌的换人还在继续
李斌对蔚来和乐道人事调整还在继续。 4月10日,蔚来发布内部邮件宣布大量人事变动。 蔚来方面: 原用户关系(UR)负责人沈泓因个人原因将离开公司。 任命孙明担任用户关系(UR)负责人,向高级副总…...
Pytest 自动化测试框架详解
Pytest和Unittest测试框架的区别? 如何区分这两者,很简单unittest作为官方的测试框架,在测试方面更加基础,并且可以再次基础上进行二次开发,同时在用法上格式会更加复杂;而pytest框架作为第三方框架&#x…...
sqli-labs靶场 less 9
文章目录 sqli-labs靶场less 9 时间盲注 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
奇趣点播系统测试报告
1.项目简介 本项目旨在搭建一个视频共享点播系统,服务器支持用户通过前端浏览器访问服务器,获取展示与观看和操作的界面,最终实现视频的上传以及观看和删改查等基础管理功能。让用户拥有良好的观看体验和分享视频的快捷方式,此外…...
空地机器人在复杂动态环境下,如何高效自主导航?
随着空陆两栖机器人(AGR)在应急救援和城市巡检等领域的应用范围不断扩大,其在复杂动态环境中实现自主导航的挑战也日益凸显。对此香港大学王俊铭基于阿木实验室P600无人机平台自主搭建了一整套空地两栖机器人,使用Prometheus开源框架完成算法的仿真验证与…...
01 - QEMU 初始化概览 - Init()
目录 1.初始化 - qemu_init() 1.1.基本设备 1.2.日志 1.3.模块信息 1.4.子系统 1.5.选项解析 - 阶段一 1.6.选项解析 - 阶段二 1.7.选项配置 1.8.Trace 1.9.主线程 1.10.CPU 时钟 1.11.其他设置 1.12.创建虚拟机 1.13.启动虚拟机 2.主线程 - qemu_main() 2.1.处…...
Vue3 使用ref
<button click"changeMsg">change</button> <div>{{ message }}</div>//接受一个内部值并返回一个响应式且可变的 ref 对象。ref 对象仅有一个 .value property,指向该内部值。 const message ref(hello world) const mum 1 co…...
React中 点击事件写法 的注意(this、箭头函数)
目录 1、错误写法:onClick{this.acceptAlls()} 2、正确写法:onClick{this.acceptAlls}(不带括号) 总结 方案1:构造函数绑定 方案2:箭头函数包装方法(更简洁) 方案3&am…...
DeepSeek AI大模型:中国智能时代的“争气机“-AI生成
DeepSeek AI大模型:中国智能时代的"争气机" 当全球科技巨头在万亿参数竞赛中你追我赶时,一家中国公司悄然改写了游戏规则。DeepSeek AI最新发布的"探月"大模型不仅以中英双语能力打破技术壁垒,更用"动态脑区"设…...
Java老鼠迷宫(递归)---案例来自韩顺平老师讲Java
题目: 粉色圈圈是启动,红色方框是阻挡,蓝色五角星是出口,走到出口,老鼠winner 代码: public class test6 {public static void main(String[] args){//创建二维数组int[][] map new int[8][7];// 最外围都…...
Python大数据视频教程
概述 最新整理的Python大数据视频教程已出,需要学习的小伙伴抓紧了。 课程亮点: ❶ 编程基石:从Python基础到高阶函数式编程,用代码驯服数据 ❷ 数据魔法:SQL进阶ETL实战,Pandas玩转百万级数据分析 ❸ 分…...
Java工厂模式解析:灵活对象创建的实践指南
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、模式定义与分类 工厂模式(Factory Pattern)是创建型设计模式的核心成员之一,主要解决对象创建过程中的灵活性问题。根…...
PDF转换格式失败?原因及解决方法全解析
在日常工作中,我们经常会遇到将PDF转换为Word、Excel、PPT等格式的需求。有时候以为一键转换就能搞掂,没想到却转换失败。到底问题出在哪?别急,我们可以看看是否以下几个问题引起的,找到解决问题的关键! 原…...
《轨道力学讲义》——第五讲:摄动理论基础
第五讲:摄动理论基础 引言 在实际的航天任务中,我们很少能够使用理想的二体问题来精确描述航天器的运动。地球的非球形性、大气阻力、太阳辐射压以及第三天体引力等各种因素都会对航天器轨道产生偏离理想轨道的影响。这些额外的力被称为"摄动力&q…...
【NLP】23.小结:选择60题
Question 1: What does the fixed lookup table in traditional NLP represent? A. A table of one‐hot vectors B. A table of pre‐trained dense word embeddings C. A dictionary of word definitions D. A table of n-gram counts Answer (中文): 答案选 B。传统NLP中“…...
C++核心机制-this 指针传递与内存布局分析
示例代码 #include<iostream> using namespace std;class A { public:int a;A() {printf("A:A()的this指针:%p!\n", this);}void funcA() {printf("A:funcA()的this指针:%p!\n", this);} };class B { public:int b;B() {prin…...
python asyncio 的基本使用
1、引言 asyncio 是 Python 标准库中的一个库,提供了对异步 I/O 、事件循环、协程和任务等异步编程模型的支持。 asyncio 文档 2、进程、线程、协程 线程 线程是操作系统调度的基本单位,同一个进程中的多个线程共享相同的内存空间。线程之间的切换由操…...
大模型中提到的分词器是什么
分词器在大模型中的核心解析 1. 分词器的定义与基本作用 分词器(Tokenizer)是自然语言处理(NLP)中的核心组件,负责将原始文本拆分为模型可处理的离散单元(称为Token)。其核心功能包括: 文本离散化:将连续字符序列转化为数字序列,作为模型的输入。语义单元提取:通过…...
Android中使用BuildConfig.DEBUG无法找到的解决方法
BuildConfig是Android构建工具自动生成的一个类,通常位于应用的包名下,包含一些构建相关的常量,比如DEBUG标志、应用ID、版本信息等。 遇到的问题可能有几种情况。首先,可能项目没有正确构建,导致BuildConfig没有被生…...
Python(14)Python内置函数完全指南:从基础使用到高阶技巧
目录 背景介绍一、内置函数全景分类1. 数据类型转换(15个)2. 数学运算(12个)3. 迭代处理(9个)4. 对象操作(11个)5. 输入输出(4个) 二、高阶函数应用场景1. en…...
echo命令,tail命令,反引号,重定向符
echo命令: 作用:在命令行中输出指定的内容,相当于print语句 语法:echo 指定的内容(当内容包含空格和特殊字符的时候,语句很复杂的时候,最好用双引号括起来) tail命令:…...
集成学习介绍
集成学习(Ensemble Learning)是一种机器学习范式,它通过组合多个模型的预测来提高整体模型的性能。单一模型可能在某些方面表现不佳或具有较高的偏差或方差,而集成方法能够通过结合多个模型的优点来克服这些问题,从而提…...
【CUDA】ubuntu环境下安装cuda
写在前面 软硬件匹配问题 :如老显卡安装ubuntu24, 会发现适合显卡的cuda不适合ubuntu24, 适合ubuntu24的cuda不适合显卡,因此安装ubuntu系统前,务必查明 :当前设备的显卡支持的cuda,支持哪些ubuntu版本 下面的三个问题…...
进程间通信-信号量
消息队列(Message Queue)是一种在不同组件或进程间进行异步通信的机制,它允许应用程序以松耦合的方式交换消息。消息队列就像一个缓冲区,发送者将消息放入队列,接收者从队列中取出消息进行处理。以下为你详细介绍消息队…...
Ubuntu 22.04安装MySQL : Qwen2.5 模型对话数据收集与微调教程
在Ubuntu 22.04安装MySQL的教程请点击下方链接进行参考: 点击这里获取MySQL安装教程 今天将为大家带来如何微调Qwen2.5模型并连接数据库进行对话的教程。快跟着小编一起试试吧~ 1 大模型 Qwen2.5 微调步骤 1.1 从 github 仓库 克隆项目 克隆存储库:#拉取代码 git clo…...
L1-8 新年烟花
单位 杭州百腾教育科技有限公司 新年来临,许多地方会举行烟花庆典庆祝。小 C 也想参加庆典,但不幸的是跟他一个想法的人实在太多,活动场地全是人人人人人人人人人…… 活动场地可视作一个 NM 的矩阵,其中有一些格子是空的&#…...
OpenCV中的轮廓检测方法详解
文章目录 引言一、什么是轮廓?二、OpenCV中的轮廓检测基础1. 基本步骤2. findContours函数详解 三、轮廓检索模式四、轮廓近似方法五、轮廓特征分析1. 轮廓面积2. 轮廓周长/弧长3. 轮廓近似(多边形拟合)4. 凸包5. 边界矩形6. 最小闭合圆7. 拟…...
AIP-231 批量方法:Get
编号231原文链接AIP-231: Batch methods: Get状态批准创建日期2019-06-18更新日期2019-06-18 一些API允许用户获取一组特定资源在一个时间点(例如使用读事务)的状态。批量获取方法提供了这个功能。 指南 API 可以 按照以下模式支持批量获取࿱…...
人工智能基础-matplotlib基础
绘制图形 import numpy as np x np.linspace(0, 10, 100) y np.sin(x) import matplotlib as mpl import matplotlib.pyplot as plt plt.plot(x, y) plt.show()绘制多条曲线 siny y.copy() cosy np.cos(x) plt.plot(x, siny) plt.plot(x, cosy) plt.show()设置线条颜色 …...
qt运行时报段错误
标题: qt运行时报段错误,查看stack,显示: 原因 报错的cpp文件新包含一个头文件,这个头文件里的pack指令有问题,如下: 解决办法 修改为正确的pack指令。...
【Qt】Qt Creator开发基础:项目创建、界面解析与核心概念入门
🍑个人主页:Jupiter. 🚀 所属专栏:QT 欢迎大家点赞收藏评论😊 目录 Qt Creator 新建项⽬认识 Qt Creator 界⾯项⽬⽂件解析Qt 编程注意事项认识对象模型(对象树)Qt 窗⼝坐标体系 Qt Creator 新…...
CAP应用
1.工作原理 CAP(Consistent,Available,Partition - tolerant)框架在.NET 中的工作原理。CAP 是一个用于.NET 的分布式事务解决方案,主要用于实现微服务架构中的数据一致性(实现分布式事务的最终一致性&…...
典型操作系统内核架构
在典型操作系统架构(如下图所示)中,内核负责以安全、公平的方式为多个应用程序管理和共享硬件资源。 内核通过一组 API(即系统调用)向应用程序提供服务。这些 API 不同于常规库函数,因其是用户模式到内核模…...
AWS Redshift的使用场景及一些常见问题
Redshift 不是关系型数据库, 提供了Amazon Redshift Serverless 和 Amazon Redshift 都是构建于 Redshift 数仓引擎之上的,但它们适用的场景不同。Redshift和Dynamodb都可以存储数据, 分别怎么选择? 这里记录一些常见的问题和场景。 1. 如何选择用Amazon Redshift…...
**searchProperties 是什么,python中**是什么:解包字典的操作符
searchProperties 是什么,python中是什么:解包字典的操作符 在 Python 中,** 是用于解包字典的操作符,**searchProperties 是一个可变关键字参数。它允许函数接受任意数量的关键字参数,这些参数会被收集到一个字典中,字典的键是参数名,值是参数对应的值。 在 ButtonCon…...
.NET MCP 文档
MCP 概述 MCP(Model Context Protocol)是由 Anthropic 推出的一种开放协议,类似 AI 的 USB-C 扩展坞,用于在大模型和数据源之间建立安全的通信(授权),让 AI 应用能够安全地访问和操作本地或远程…...
07软件测试需求分析案例-修改用户信息
修改用户信息是后台管理菜单的一个功能模块,只有admin才有修改权限。包括查询用户名进行显示用户相关信息,并且修改用户相关信息的功能。 1.1 通读文档 通读需求规格说明书是提取信息,提出问题,输出具有逻辑、规则、流程的业务…...
第九届“创客中国”中小企业创新创业大赛总决赛企业组三等奖项目—基于AI智能代码疫苗技术的数字供应链安全解决方案
项目名称:基于AI智能代码疫苗技术的数字供应链安全解决方案 企业名称:北京安普诺信息技术有限公司(悬镜安全) 项目简介: 基于AI智能代码疫苗技术的数字供应链安全解决方案,悬镜安全在全球范围内首创…...
企业级RAG行业应用落地方案——阿里云百炼
行业痛点分析 这张图主要围绕“行业痛点锚定”展开,通过雷达图和表格结合的方式,分析电商选品在不同维度下的情况: 分析对象:聚焦电商选品。维度展示:从可结构化程度、重复性、数据可得性、人机互动性、AI带来的价值这…...
Mac切换node版本
Mac切换node版本 1.首先安装n模块: sudo npm install -g n 2.升级node.js到最新稳定版 sudo n stable 3.升级到最新版 sudo n latest 4.n后面也可以跟随版本号,升级到任意版本 sudo n v0.10.26或sudo n 0.10.26 5.切换使用版本 sudo n 7.10.0 6.删除制定版本…...
从零开始学A2A一:A2A 协议概述与核心概念
A2A 协议概述与核心概念 学习目标 基础理解 掌握A2A协议的基本概念和背景理解协议的设计原则和核心思想了解协议在AI领域的重要性 技术掌握 熟悉A2A协议的核心功能组件掌握能力发现和任务管理机制理解多模态交互和安全通信原则 实践应用 能够设计基于A2A的智能体系统掌握协议…...
科普:如何通过ROC曲线,确定二分类的“理论阈值”
在二分类问题中,已知预测概率(如逻辑回归、神经网络输出的概率值)时,阈值的选择直接影响分类结果(正/负样本判定)。 一、实践中的阈值选择方法 1. 基于业务目标的调整 最大化准确率:适用于样…...
Cherry Studio + MCP,从0到1保姆教程,3个场景体验
📺 详细操作以视频方式呈现,视频地址周五会更新出来 💯 鉴于很多观众网络环境受限,文末提供所需安装文件网盘分享 💬 什么是 MCP ? MCP(Model Context Protocol,MCP)模型…...
Docker学习笔记-docker安装、删除
一、在centOS 7中docker的默认安装目录 # Docker 主配置文件目录 ls /etc/docker# Docker 数据目录(镜像、容器、卷等) ls /var/lib/docker# Docker 可执行文件路径 which docker # 输出类似 /usr/bin/docker 二、docker文件目录说明 目录/文件用途/…...
visual studio 常用的快捷键(已经熟悉的就不记录了)
以下是 Visual Studio 中最常用的快捷键分类整理,涵盖代码编辑、调试、导航等核心场景: 一、生成与编译 生成解决方案 Ctrl Shift B 一键编译整个解决方案,检查编译错误(最核心的生成操作)编译当前文件 Ctrl F…...
使用人工智能大模型腾讯元宝,如何做课题研究?
今天我们学习使用人工智能大模型腾讯元宝,如何做课题研究? 手把手学习视频地址:https://edu.csdn.net/learn/40402/666424 在腾讯元宝对话框中输入如何协助老师做课题(申报书、开题报告、中期报告、结题报告)&#x…...
开源模型应用落地-模型上下文协议(MCP)-第三方MCP Server实战指南(五)
一、前言 在AI技术高速发展的2025年,如何让大语言模型(LLM)更灵活地调用外部工具与数据,成为开发者关注的焦点。模型上下文协议(MCP)作为AI与外部资源的“万能接口”,通过标准化交互框架解决了传统集成中的碎片化问题。而第三方MCP Server的引入,进一步降低了开发门…...