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

RabbitMQ中的Publish-Subscribe模式

在现代分布式系统中,消息队列(Message Queue)是实现异步通信和解耦系统的关键组件。RabbitMQ 是一个功能强大且广泛使用的开源消息代理,支持多种消息传递模式。其中,Publish/Subscribe(发布/订阅)模式是一种常见且重要的模式,它允许消息发布者将消息广播给多个订阅者。

本文将深入探讨 RabbitMQ 中的 Publish/Subscribe 模式,包括其工作原理、实现方式、适用场景以及最佳实践。


1. Publish/Subscribe 模式简介

1.1 什么是 Publish/Subscribe 模式?

Publish/Subscribe(发布/订阅)模式是一种消息传递模式,它将消息的发送者(发布者)和接收者(订阅者)解耦。发布者将消息发布到一个交换机(Exchange),而订阅者通过绑定到交换机的**队列(Queue)**来接收消息。

与点对点模式(如工作队列)不同,Publish/Subscribe 模式允许多个订阅者接收相同的消息,从而实现消息的广播。

在这里插入图片描述

1.2 核心概念

在 RabbitMQ 中,Publish/Subscribe 模式依赖以下核心组件:

  • 发布者(Publisher):发送消息的客户端。
  • 交换机(Exchange):接收发布者发送的消息,并根据规则将消息路由到队列。
  • 队列(Queue):存储消息的缓冲区。
  • 订阅者(Subscriber):从队列中消费消息的客户端。
  • 绑定(Binding):定义交换机和队列之间的关系。

2. Publish/Subscribe 模式的工作原理

2.1 交换机的作用

在 RabbitMQ 中,消息不会直接发送到队列,而是发送到交换机。交换机根据绑定规则将消息路由到相应的队列。

RabbitMQ 提供了多种类型的交换机,其中最常用的是:

  • Fanout 交换机:将消息广播到所有绑定到它的队列,忽略路由键(Routing Key)。
  • Direct 交换机:根据消息的路由键将消息路由到匹配的队列。
  • Topic 交换机:支持更复杂的路由规则,允许使用通配符匹配路由键。
  • Headers 交换机:根据消息的头部属性进行路由。

在 Publish/Subscribe 模式中,通常使用 Fanout 交换机,因为它能够将消息广播到所有绑定的队列。

2.2 消息的广播过程

  1. 发布者将消息发送到交换机。
  2. 交换机接收到消息后,将消息广播到所有绑定的队列。
  3. 订阅者从队列中消费消息。

3. Java 实现 Publish/Subscribe 模式

以下是使用 Java 和 RabbitMQ Java Client 实现 Publish/Subscribe 模式的完整示例。

3.1 添加依赖

在 Maven 项目中,添加 RabbitMQ Java Client 依赖:

<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.20.0</version>
</dependency>

3.2 创建发布者(Publisher)

发布者负责将消息发送到交换机。以下是发布者的代码:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.nio.charset.StandardCharsets;public class Publisher {private static final String EXCHANGE_NAME = "publisher_subscriber";public static void main(String[] argv) throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.200.138");factory.setPort(5672);factory.setVirtualHost("/test");factory.setUsername("test");factory.setPassword("test");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 声明一个 Fanout 交换机channel.exchangeDeclare(EXCHANGE_NAME, "fanout");// 发布消息String message = "Hello, Subscribers!";channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes(StandardCharsets.UTF_8));System.out.println(" [x] Sent '" + message + "'");}}
}

3.3 创建订阅者(Subscriber)

订阅者负责从队列中消费消息。以下是订阅者的代码:

import com.rabbitmq.client.*;import java.nio.charset.StandardCharsets;public class Subscriber {private static final String EXCHANGE_NAME = "publisher_subscriber";public static void main(String[] argv) throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.200.138");factory.setPort(5672);factory.setVirtualHost("/test");factory.setUsername("test");factory.setPassword("test");Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 声明一个 Fanout 交换机channel.exchangeDeclare(EXCHANGE_NAME, "fanout");// 创建一个临时队列,并绑定到交换机String queueName = channel.queueDeclare().getQueue();channel.queueBind(queueName, EXCHANGE_NAME, "");System.out.println(" [*] Waiting for messages. To exit press CTRL+C");// 定义消息处理函数DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), StandardCharsets.UTF_8);System.out.println(" [x] Received '" + message + "'");};// 开始消费消息channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {});}
}

3.4 运行示例

  • 启动多个订阅者,在不同的终端窗口中运行多个订阅者实例

    启动多个订阅者后,能在RabbitMQ终端页面,能看到多个临时的队列,但交换机只有一个publisher_subscriber

在这里插入图片描述

在这里插入图片描述

  • 启动发布者,在另一个终端窗口中运行发布者
3.4.1 观察输出

所有订阅者都会收到发布者发送的消息。例如:

发布者输出:

 [x] Sent 'Hello, Subscribers!'

订阅者输出:

 [*] Waiting for messages. To exit press CTRL+C[x] Received 'Hello, Subscribers!'

在这里插入图片描述


4. 代码解析

4.1 发布者代码解析

  • 连接工厂ConnectionFactory 用于创建到 RabbitMQ 服务器的连接。
  • 交换机声明channel.exchangeDeclare(EXCHANGE_NAME, "fanout") 声明一个 Fanout 交换机。
  • 消息发布channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes(StandardCharsets.UTF_8)) 将消息发送到交换机。

4.2 订阅者代码解析

  • 临时队列channel.queueDeclare().getQueue() 创建一个非持久化的、独占的临时队列。
  • 队列绑定channel.queueBind(queueName, EXCHANGE_NAME, "") 将队列绑定到交换机。
  • 消息处理DeliverCallback 定义了如何处理接收到的消息。
  • 消费消息channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { }) 开始消费消息。

5. Publish/Subscribe 模式的适用场景

5.1 日志记录

在分布式系统中,日志记录是一个常见的需求。使用 Publish/Subscribe 模式,可以将日志消息广播给多个日志处理器,分别将日志写入文件、数据库或发送到监控系统。

5.2 实时通知

在社交网络或即时通讯应用中,可以使用 Publish/Subscribe 模式向多个用户发送实时通知。例如,当用户发布新动态时,通知所有关注者。

5.3 分布式缓存更新

在分布式缓存系统中,当缓存数据更新时,可以使用 Publish/Subscribe 模式通知所有缓存节点同步更新。

5.4 事件驱动架构

在事件驱动架构中,Publish/Subscribe 模式用于实现事件的广播。例如,当用户注册成功时,发布一个事件,通知多个服务(如邮件服务、积分服务)执行相应的操作。


6. 最佳实践

6.1 使用持久化

为了确保消息不会丢失,建议将交换机和队列设置为持久化。例如:

channel.exchangeDeclare(EXCHANGE_NAME, "fanout", true);
channel.queueDeclare("my_queue", true, false, false, null);

6.2 处理消息确认

在生产环境中,建议启用消息确认机制,确保消息被成功消费。例如:

channel.basicConsume(queueName, false, deliverCallback, consumerTag -> { });

6.3 避免消息积压

在高并发场景下,可能会出现消息积压的情况。可以通过设置队列的最大长度或使用**死信队列(DLX)**来处理积压的消息。

6.4 监控和报警

使用 RabbitMQ 的管理界面或监控工具(如 Prometheus + Grafana)监控消息队列的状态,并设置报警规则,及时发现和解决问题。


7. 总结

Publish/Subscribe 模式是 RabbitMQ 中一种强大且灵活的消息传递模式,适用于需要将消息广播给多个订阅者的场景。通过使用 Fanout 交换机,可以轻松实现消息的广播,同时结合持久化、消息确认和监控机制,可以构建高可靠性的分布式系统。

相关文章:

RabbitMQ中的Publish-Subscribe模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信和解耦系统的关键组件。RabbitMQ 是一个功能强大且广泛使用的开源消息代理&#xff0c;支持多种消息传递模式。其中&#xff0c;Publish/Subscribe&#xff08;发布/订阅&#xff0…...

简单了解一下 Go 语言的构建约束?

​构建约束是一种在 Go 语言中控制源文件编译条件的方法&#xff0c;它可以让您指定某些文件只在特定的操作系统、架构、编译器或 Go 版本下编译&#xff0c;而在其他环境中自动忽略。这样可以方便您针对不同的平台或场景编写不同的代码&#xff0c;实现条件编译的功能。 构建…...

图像融合算法笔记2024 CDTNet

目录 ControlCom-Image-Composition CDTNet-High-Resolution-Image-Harmonization 依赖项: trilinear 效果图: 推理代码ok 只支持linux系统: ControlCom-Image-Composition CDTNet-High-Resolution-Image-Harmonization 开源地址: GitHub - bcmi/CDTNet-High-Reso…...

我们来对接蓝凌OA --报文格式

题记 数智化办公专家、国家高新技术企业、知识管理国家标准制定者、信创供应商10强…等等&#xff0c;这些和咱们有关系吗&#xff01;&#xff01;不好意思&#xff0c;走错片场了&#xff0c;刚和项目经理在甲方那边吹牛B想想刚刚的大饼&#xff0c;看看支付宝余额&#xff…...

npm、yarn、pnpm三者的异同

这个表格将会说明一切&#xff1a; 特性npmyarnpnpm依赖管理方式扁平化管理&#xff0c;嵌套依赖树&#xff0c;可能重复安装扁平化管理喝符号链接&#xff0c;同版本只能安装一次基于硬链接喝符号链接的内容寻址存储安装速度最慢中等(并行安装)最快(得益于硬链接的复用)磁盘空…...

纯CSS实现文本或表格特效(连续滚动与首尾相连)

纯CSS实现文本连续向左滚动首尾相连 1.效果图&#xff1a; 2.实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, init…...

信号处理:概念、技术、领域

目录 基本概念 主要技术 应用领域 信号处理是一个涉及分析、修改和再生信号的多学科领域。信号可以是各种形式的&#xff0c;例如声音、图像、视频或其他类型的监测数据。信号处理的主要目标是提取有用的信息并增强信号的质量。以下是信号处理的一些基本概念和应用&#xff…...

Android 中 Activity 和 Fragment 的结合使用经典案例

学习笔记 0. 分析 Activity 与 Fragment 的区别&#xff0c;部分使用的差异 上一篇中我们分析了Activity 与 Fragment 的区别&#xff0c;部分使用的差异。 点我跳转上一篇 1. 单个 Activity 中使用多个 Fragment 这是最常见的用法之一&#xff0c;特别是在单屏幕应用中。通…...

Http协议在网站中的体现

文章目录 1. Http协议简介2. 网站中的体现2.1 访问网站2.2 请求2.3 请求头2.4 请求方式2.5 响应 3. 总结 1. Http协议简介 HTTP&#xff08;超文本传输协议&#xff09; 是一种广泛应用于互联网上的应用层协议&#xff0c;用于在Web浏览器和Web服务器之间传输数据。HTTP协议定…...

CTF-WEB: php-Session 文件利用 [第一届国城杯 n0ob_un4er 赛后学习笔记]

step 1 搭建容器 教程 A5rZ 题目 github.com Dockerfile 有点问题,手动修复一下 FROM php:7.2-apacheCOPY ./flag /root COPY ./readflag / COPY ./html/ /var/www/html/ COPY ./php.ini /usr/local/etc/php/php.ini COPY ./readflag /readsecretRUN chmod 755 /var/www…...

《计算机视觉:瓶颈之辩与未来之路》

一、计算机视觉的崛起 计算机视觉是使用计算机模仿人类视觉系统的科学&#xff0c;让计算机拥有类似人类提取、处理、理解和分析图像以及图像序列的能力。它是一个多学科交叉的领域&#xff0c;与机器视觉、图像处理、人工智能、机器学习等领域密切相关。 计算机视觉行业可分为…...

黑皮书-计算机科学导论02

目录 第二部分&#xff1a;计算机硬件 第5章计算机组成 5.1中央处理单元 Ⅰ.算数逻辑单元 Ⅱ.控制单元 Ⅲ.寄存器 5.2主存储器 Ⅰ.随机存取存储器(RAM) Ⅱ.只读存储器(ROM) 高速缓冲存储器(Cache) 5.3输入/输出子系统 Ⅰ.非存储设备 Ⅱ.存储设备&#xff08;辅助存…...

React--》如何高效管理前端环境变量:开发与生产环境配置详解

在前端开发中&#xff0c;如何让项目在不同环境下表现得更为灵活与高效&#xff0c;是每个开发者必须面对的挑战&#xff0c;从开发阶段的调试到生产环境的优化&#xff0c;环境变量配置无疑是其中的关键。 env配置文件&#xff1a;通常用于管理项目的环境变量&#xff0c;环境…...

初始Python篇(6)—— 字符串

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 字符串的常见操作 格式化字符串 占位符 f-string 字符串的 format 方法 字符串的编码与解码 与数据验证相关的方法 …...

【数字花园】个人知识库网站搭建:⑤本地构建+云服务器部署数字花园plus

目录 写在前面&#xff1a;数字花园的定义[[数字花园]]网站的构建原理包括三个步骤&#xff1a;[[我的数字花园搭建笔记]] 现在的部署流程一、本地操作详细教程-2.前置步骤&#xff08;前面的文章都提过&#xff09;-1.创建github中转库0. 本地环境配置基础环境&#xff1a;git…...

力扣题目 - 3264.K 次乘运算后的最终数组I

题目 还需要你前往力扣官网查看详细的题目要求 地址 1.给你一个整数数组 nums &#xff0c;一个整数 k 和一个整数 multiplier 。2.你需要对 nums 执行 k 次操作&#xff0c;每次操作中&#xff1a;找到 nums 中的 最小 值 x &#xff0c;如果存在多个最小值&#xff0c;选择最…...

Java常用 Date 时间格式化、Calender日历、正则表达式的用法

目录 1. SimpleDateFormat 日期格式化类 1.1 Date 类型转 String 1.2 String 类型转 Date 2. Calendar 日历类 3. 正则表达式 3.1 正则表达式的组成部分 3.2 手机号正则表达式 3.3 常用密码校验正则表达式 1. SimpleDateFormat 日期格式化类 SimpleDateFormat 是Java中…...

网页爬虫技术全解析:从基础到实战

引言 在当今信息爆炸的时代&#xff0c;互联网上的数据量每天都在以惊人的速度增长。网页爬虫&#xff08;Web Scraping&#xff09;&#xff0c;作为数据采集的重要手段之一&#xff0c;已经成为数据科学家、研究人员和开发者不可或缺的工具。本文将全面解析网页爬虫技术&…...

细说STM32F407单片机SPI基础知识

目录 一、 SPI接口和通信协议 1、 SPI硬件接口 &#xff08;1&#xff09;MOSI(Master Output Slave Input) &#xff08;2&#xff09;MISO(Master Input Slave Output) &#xff08;3&#xff09;SCK 2、SPI传输协议 &#xff08;1&#xff09;CPHA0时的数据传输时序 …...

【OJ题解】面试题三步问题

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 **题目链接****解题思路****1. 问题分析****2. 递归思路****3. 优化方案&a…...

Linux vi/vim 编辑器使用教程

Linux vi/vim 编辑器使用教程 引言 Linux 系统中的 vi 和 vim 是非常强大的文本编辑器&#xff0c;它们以其高效性和灵活性而闻名。vim 是 vi 的增强版&#xff0c;提供了更多的功能和改进的用户界面。本文将详细介绍 vi/vim 的基本用法&#xff0c;包括打开文件、编辑文本、…...

长安大学《2024年812自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《长安大学812自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题...

服务器一般装什么系统?

在服务器管理中&#xff0c;操作系统的选择是一个关键因素&#xff0c;它直接影响到服务器的稳定性、性能和可维护性。那么为什么有些服务器选择Linux&#xff0c;而不是Windows&#xff1f;选择合适的操作系统对服务器的性能和安全性有多么重要&#xff1f; 在众多操作系统中…...

Gitlab ci/cd 从0-1持续集成持续发布前端

关于gitlab ci/cd&#xff0c;就是实现DevOps的能力&#xff0c;即Development &Operations的缩写&#xff0c;也就是开发&运维。CI/CD 指的是软件开发的持续集成方法&#xff0c;我们可以持续构建、测试和部署软件。通过持续方法的迭代能使得我们减少在错误代码或者错…...

#GC4049. GC.2017---. GC.2016.六年级

这套题包含了历年真题&#xff0c;包含了前面我写的博客中的题目&#xff0c;十分重要&#xff01;&#xff01;&#xff01;&#xff01;要考试的同学可以参考一下&#xff01;&#xff01; 此套题限时3小时。 #GC4049. GC.2017.六年级.01.更多闰年 题目描述 在 smoj 网站上…...

UE5中实现Billboard公告板渲染

公告板&#xff08;Billboard&#xff09;通常指永远面向摄像机的面片&#xff0c;游戏中许多技术都基于公告板&#xff0c;例如提示拾取图标、敌人血槽信息等&#xff0c;本文将使用UE5和材质节点制作一个公告板。 Gif效果&#xff1a; 网格效果&#xff1a; 1.思路 通过…...

Android系统(android app和系统架构)

文章目录 AndroidAndroid Apps四大组件 Android系统Platform API之下&#xff1a;一个微笑内核adb(Android Debug Bridge) Android包管理机制Android的Intent机制参考 Android LinuxFrameworkJVM 在Linux/Java上做了个二次开发&#xff1f;并不完全是&#xff1a;Android定义…...

docker设置容器自动启动

说起开机自动启动应该很多人都遇到过&#xff0c;我们公司做的系统很多的中间件都没有设置开机自动启动然后中间修改问题又设置了一些临时生效的文件&#xff0c;开始的时候大家都不以为意&#xff0c;知道公司陆续有人离职入职管理交接一塌糊涂&#xff0c;项目成了历史遗留问…...

在 React 中,创建和嵌套组件、添加标签和样式、显示数据、渲染条件和列表、对事件做出响应并更新界面以及在组件间共享数据是常见的任务

文章目录 1. 创建和嵌套组件创建组件嵌套组件 2. 添加标签和样式添加标签添加样式 3. 显示数据显示静态数据显示动态数据 4. 渲染条件和列表条件渲染列表渲染 5. 对事件做出响应并更新界面处理事件 6. 在组件间共享数据使用 Context API react 如何创建和嵌套组件 如何添加标签…...

Android命令行工具--dumpsys

dumpsys 是一种在 Android 设备上运行的工具&#xff0c;可提供有关系统服务的信息。可以使用 Android 调试桥 (adb) 从命令行调用 dumpsys&#xff0c;获取在连接的设备上运行的所有系统服务的诊断输出。 此输出通常比您想要的更详细&#xff0c;因此请使用此页面上的命令行选…...

设计模式-访问者模式

背景 做一个对歌手的评价系统&#xff0c;观众分为男人和女人&#xff0c;分别对歌手做出自己的评价。 传统思路&#xff1a; 做一个person父类&#xff0c;Man 和 Woman分别继承自这个父类&#xff0c;在这两个类中执行各自操作。 问题&#xff1a; 可拓展性差&#xff0…...

Vue集成阿里云点播实现视频上传

实现方式有多种&#xff0c;如下是我的实现方式&#xff1a; 一、下载点播插件&#xff0c;在 public 下的 index.html 中引入阿里云点播需要的 js 插件&#xff0c;js 文件最好放在 cdn 上,&#xff0c;这里以放在 public 文件夹下的 static 文件夹中为例&#xff1a; <s…...

ByteByteGo-Forward/Reverse Proxy正/反向代理

原文链接 EP137: Proxy Vs Reverse proxy - ByteByteGo Newsletter 参考链接 Forward proxy vs. reverse proxy: Whats the difference? | TheServerSide 正向代理 &#xff08;Forward Proxy&#xff09; 位置&#xff1a;用户设备 和 互联网 之间 用途&#xff1a;保护客…...

[论文阅读] |智能体长期记忆与反思

写在前面&#xff1a;10月份的时候&#xff0c;联发科天玑9400发布&#xff0c;搭载这款旗舰 5G 智能体 AI 芯片的荣耀MagicOS9.0实现了一句话让手机自动操作美团点咖啡。很快商场实体店里便能看到很多品牌手机已经升级为智能体语音助手。下一步&#xff0c;这些智能体或许便能…...

Elasticsearch Kibana (windows版本) 安装和启动

目录 1.安装 2.启动 elasticsearch 3.启动 kibana 1.安装 elasticsearch下载&#xff0c;官网链接&#xff1a; Download Elasticsearch | Elastichttps://www.elastic.co/downloads/elasticsearch kibana下载&#xff0c;官网链接&#xff1a; Download Kibana Free | G…...

CSS系列(9)-- Transform 变换详解

前端技术探索系列&#xff1a;CSS Transform 变换详解 &#x1f504; 致读者&#xff1a;探索 CSS 变换的魔力 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS Transform&#xff0c;学习如何创建引人注目的 2D 和 3D 变换效果。 2D 变换基础 &#x1f68…...

bs4基本运用

1. bs4基本使用 1.1. 简介 bs4的全称为 BeautifulSoup。和lxml一样&#xff0c;是一个html的解析器&#xff0c;主要功能也是解析数据和提取数据 。 本模块作为了解模块&#xff0c;实际开发中很少用这个模块去解析数据&#xff0c;大家可能会想为什么这个模块会逐渐被淘汰&…...

skywalking 搭建 备忘录

基础环境 apache-skywalking-apm-9.6.0.tar.gz apache-skywalking-java-agent-9.1.0.tgz elasticsearch 7.14.1 采用dockers搭建 或者手动部署 kibana 可视化 应用 微服务版 consumer.jar eureka.jar 注册中心 provider.jar skywalking 地址 https://skywalkin…...

C# 和 go 关于can通信得 整理

在C#中开发CAN&#xff08;Controller Area Network&#xff09;通信接口时&#xff0c;确实有一些现成的NuGet包可以简化你的开发工作。这些库通常提供了与CAN硬件接口通信所需的基本功能&#xff0c;如发送和接收CAN消息。下面是一些常用的NuGet包&#xff1a; PCANBasic.NET…...

Unity类银河战士恶魔城学习总结(P179 Enemy Archer 弓箭手)

教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了敌人弓箭手的制作 Enemy_Archer.cs 核心功能 状态机管理敌人的行为 定义了多个状态对象&#xff08;如 idleState、moveState、attackState 等&#xff09;&#xff0c;通过状态机管理敌人的…...

一、LRU缓存

LRU缓存 1.LRU缓存介绍2.LRU缓存实现3.LRU缓存总结3.1 LRU 缓存的应用3.2 LRU 缓存的优缺点 1.LRU缓存介绍 LRU是Least Recently Used 的缩写&#xff0c;意为“最近最少使用”。它是一种常见的缓存淘汰策略&#xff0c;用于在缓存容量有限时&#xff0c;决定哪些数据需要被删…...

基于python绘制数据表(上)

利用python绘制各种数据图表 绘制柱形图-源码 from openpyxl import Workbook from openpyxl.chart import BarChart, Reference# 创建工作薄 wb Workbook(write_onlyTrue) # 创建工作表 ws wb.create_sheet(月收入)# 准备数据 rows [(月份, 销售额),(1, 23),(2, 43),(3, …...

Python Segmentation fault错误定位办法

1. 说明 Python3执行某一个程序时&#xff0c;报Segmentation fault (core dumped)错&#xff0c;但没有告知到底哪里出错&#xff0c;无法查问题&#xff0c;这时就需要一个库faulthandler来帮助分析。 2. 安装faulthandler faulthandler在Python3.3之后成为标准库&#xf…...

快速在远程服务器执行命令、批量在多个服务器执行命令(基于sshpass的自定义脚本fastsh)

在日常服务器操作中&#xff0c;很多时候我们需要同时操作多个服务器。特别对于那些每个服务器都需要操作相同命令的场景&#xff0c;不断的切换命令会话窗口会比较麻烦。基于此&#xff0c;编写了本文中的 fastsh 脚本用于轻度解决这种问题&#xff0c;提高一定的便利性。 使…...

Java基于SpringBoot的企业OA管理系统,附源码

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...

SSM 垃圾分类系统——环保领域的创新引擎

第1章 概述 1.1 研究背景 随着现代网络技术发展&#xff0c;对于垃圾分类系统现在正处于网络发展的阶段&#xff0c;所以对它的要求也是比较严格的&#xff0c;要从这个系统的功能和用户实际需求来进行对系统制定开发的发展方式&#xff0c;依靠网络技术的的快速发展和现代通讯…...

websocker的java集成过程

第一步&#xff1a;引入依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency> 第二步设置配置类&#xff1a; // 需要注入Bean的话必须声明为配置类 Co…...

如何对小型固定翼无人机进行最优的路径跟随控制?

控制架构 文章继续采用的是 ULTRA-Extra无人机&#xff0c;相关参数如下&#xff1a; 这里用于guidance law的无人机运动学模型为&#xff1a; { x ˙ p V a cos ⁡ γ cos ⁡ χ V w cos ⁡ γ w cos ⁡ χ w y ˙ p V a cos ⁡ γ sin ⁡ χ V w cos ⁡ γ w sin ⁡ χ…...

03、对象的内存布局以及分配方式

在通过前面的文章了解到当一个程序启动的时候&#xff0c;会把一个java文件通过编译成class文件&#xff0c;然后把class字节码加载到JVM内存中&#xff0c;并初始化各种变量和对象实例&#xff0c;同时建立起具体的内存模型进行线程间的数据交换&#xff0c;在这之间对象的实例…...

「Mac玩转仓颉内测版50」小学奥数篇13 - 动态规划入门

本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念&#xff0c;并解决一个经典问题&#xff1a;斐波那契数列。学生将学习如何使用动态规划优化递归计算&#xff0c;并掌握编程中的重要算法思想。 关键词 小学奥数Python Cangjie动态规划斐波那契数列 一、题目描述 …...