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

C++中间件DDS介绍

C++ DDS 库简介

DDS(Data Distribution Service) 是一种用于实时分布式系统通信的中间件标准,由 OMG(Object Management Group) 提出。它是一种发布/订阅(Publish/Subscribe)模式的数据通信框架,广泛应用于嵌入式系统、物联网、航空航天、机器人等领域。

C++ DDS 库是实现 DDS 标准的库,常见的实现包括:

  • RTI Connext DDS(Real-Time Innovations 提供)
  • OpenDDS(开源实现)
  • Eclipse Cyclone DDS(开源实现)
  • Fast DDS (以前称为 FastRTPS)(由 eProsima 开发)

这些库提供了丰富的 API,用于创建发布者、订阅者、定义数据类型和 QoS(Quality of Service)等功能。


DDS 的核心概念

  1. DomainParticipant:表示 DDS 系统的入口点,属于特定的域。
  2. Publisher/Subscriber:分别用于发布和订阅数据。
  3. Topic:数据通信的主题,定义通信数据的类型。
  4. DataWriter/DataReader:负责数据的写入与读取。
  5. QoS:定义数据传输的质量服务属性。

一个简单的 C++ DDS 代码示例

以下是使用 RTI Connext DDS 的一个简单例子,展示如何发布和订阅一个简单的消息数据类型。请确保你已安装 RTI Connext DDS 或其他 DDS 实现,并正确配置开发环境。

1. 定义数据类型(IDL 文件)
module HelloWorld {struct Msg {long id;string message;};
};

IDL (Interface Definition Language) 文件用于定义消息的数据结构,DDS 会通过工具生成相应的 C++ 类型。

2. 发布者(Publisher)代码
#include <iostream>
#include "HelloWorld/Msg.hpp" // 自动生成的头文件
#include "ndds/ndds_cpp.h"   // RTI Connext DDS 的核心头文件int main() {// 1. 创建 DomainParticipantDDSDomainParticipant *participant = DDSTheParticipantFactory->create_participant(0, DDS_PARTICIPANT_QOS_DEFAULT, nullptr, DDS_STATUS_MASK_NONE);if (participant == nullptr) {std::cerr << "创建 DomainParticipant 失败!" << std::endl;return -1;}// 2. 注册数据类型const char *type_name = HelloWorld::MsgTypeSupport::get_type_name();if (HelloWorld::MsgTypeSupport::register_type(participant, type_name) != DDS_RETCODE_OK) {std::cerr << "注册数据类型失败!" << std::endl;return -1;}// 3. 创建 TopicDDSTopic *topic = participant->create_topic("HelloWorldTopic", type_name, DDS_TOPIC_QOS_DEFAULT, nullptr, DDS_STATUS_MASK_NONE);if (topic == nullptr) {std::cerr << "创建 Topic 失败!" << std::endl;return -1;}// 4. 创建 Publisher 和 DataWriterDDSPublisher *publisher = participant->create_publisher(DDS_PUBLISHER_QOS_DEFAULT, nullptr, DDS_STATUS_MASK_NONE);if (publisher == nullptr) {std::cerr << "创建 Publisher 失败!" << std::endl;return -1;}DDSDataWriter *writer = publisher->create_datawriter(topic, DDS_DATAWRITER_QOS_DEFAULT, nullptr, DDS_STATUS_MASK_NONE);if (writer == nullptr) {std::cerr << "创建 DataWriter 失败!" << std::endl;return -1;}HelloWorld::MsgDataWriter *msg_writer = HelloWorld::MsgDataWriter::narrow(writer);if (msg_writer == nullptr) {std::cerr << "narrow DataWriter 失败!" << std::endl;return -1;}// 5. 发布数据HelloWorld::Msg msg;msg.id = 1;msg.message = DDS_String_dup("Hello, DDS!");if (msg_writer->write(msg, DDS_HANDLE_NIL) != DDS_RETCODE_OK) {std::cerr << "写入数据失败!" << std::endl;} else {std::cout << "消息已发布: " << msg.message << std::endl;}// 清理资源participant->delete_contained_entities();DDSTheParticipantFactory->delete_participant(participant);return 0;
}

3. 订阅者(Subscriber)代码
#include <iostream>
#include "HelloWorld/Msg.hpp"
#include "ndds/ndds_cpp.h"class MsgListener : public DDSDataReaderListener {
public:void on_data_available(DDSDataReader *reader) override {HelloWorld::MsgDataReader *msg_reader = HelloWorld::MsgDataReader::narrow(reader);if (msg_reader == nullptr) return;HelloWorld::MsgSeq data_seq;DDS_SampleInfoSeq info_seq;DDS_ReturnCode_t retcode = msg_reader->take(data_seq, info_seq, DDS_LENGTH_UNLIMITED,DDS_ANY_SAMPLE_STATE, DDS_ANY_VIEW_STATE, DDS_ANY_INSTANCE_STATE);if (retcode == DDS_RETCODE_OK) {for (int i = 0; i < data_seq.length(); ++i) {if (info_seq[i].valid_data) {std::cout << "接收到消息: id=" << data_seq[i].id<< ", message=" << data_seq[i].message << std::endl;}}msg_reader->return_loan(data_seq, info_seq);}}
};int main() {DDSDomainParticipant *participant = DDSTheParticipantFactory->create_participant(0, DDS_PARTICIPANT_QOS_DEFAULT, nullptr, DDS_STATUS_MASK_NONE);if (participant == nullptr) {std::cerr << "创建 DomainParticipant 失败!" << std::endl;return -1;}const char *type_name = HelloWorld::MsgTypeSupport::get_type_name();if (HelloWorld::MsgTypeSupport::register_type(participant, type_name) != DDS_RETCODE_OK) {std::cerr << "注册数据类型失败!" << std::endl;return -1;}DDSTopic *topic = participant->create_topic("HelloWorldTopic", type_name, DDS_TOPIC_QOS_DEFAULT, nullptr, DDS_STATUS_MASK_NONE);if (topic == nullptr) {std::cerr << "创建 Topic 失败!" << std::endl;return -1;}DDSSubscriber *subscriber = participant->create_subscriber(DDS_SUBSCRIBER_QOS_DEFAULT, nullptr, DDS_STATUS_MASK_NONE);if (subscriber == nullptr) {std::cerr << "创建 Subscriber 失败!" << std::endl;return -1;}DDSDataReader *reader = subscriber->create_datareader(topic, DDS_DATAREADER_QOS_DEFAULT, new MsgListener(), DDS_STATUS_MASK_ALL);if (reader == nullptr) {std::cerr << "创建 DataReader 失败!" << std::endl;return -1;}std::cout << "等待接收消息..." << std::endl;while (true) {DDS_Duration_t sleep_time = {1, 0};NDDSUtility::sleep(sleep_time);}participant->delete_contained_entities();DDSTheParticipantFactory->delete_participant(participant);return 0;
}

DDS和MQTT的区别

DDS(Data Distribution Service)MQTT(Message Queuing Telemetry Transport) 是两种用于分布式系统通信的协议或标准,它们在设计目标、特性和应用场景上有显著的区别。以下从多个方面对比它们:


1. 核心概念与设计目标

DDS

  • 是一种 实时分布式系统通信中间件标准,由 OMG(Object Management Group) 制定。
  • 提供 数据中心式的发布/订阅(Publish/Subscribe)模型,并且支持 点对点通信
  • 设计目标是为 低延迟、高吞吐量、实时性和可靠性 的系统提供支持,主要用于嵌入式系统、工业自动化、国防、航空航天、机器人、汽车等场景。
  • 强调 数据优先(Data-Centric),通过 Topic 直接共享数据,并支持复杂的 QoS(Quality of Service) 配置。

MQTT

  • 是一种轻量级的 消息队列协议,由 IBM 提出,后成为 OASIS 标准
  • 提供 发布/订阅(Publish/Subscribe)模型,但以 消息传输 为核心。
  • 设计目标是为 低带宽、高延迟、不可靠网络(如物联网设备)提供简单可靠的通信方式,广泛应用于物联网 (IoT)、智能家居、移动应用等场景。
  • 强调 消息优先(Message-Centric),通过 Broker 中转消息,设备之间并不直接通信。

2. 架构对比

DDS

  • 分布式架构:DDS 是去中心化的(Brokerless),无需中央服务器。所有参与者(如发布者、订阅者)可以直接通信。
  • 数据中心化:基于 Topic 共享数据,支持复杂的数据类型和强大的 QoS 配置。
  • 灵活性:支持动态发现(Dynamic Discovery),系统中的节点可以动态加入或离开。

MQTT

  • 中心化架构:MQTT 依赖于一个 Broker(中间服务器),所有消息都通过 Broker 转发。
  • 消息传输:基于 Topic 组织消息,消息是无状态的,数据类型简单(通常是字符串或 JSON)。
  • 设备简单性:客户端实现非常轻量,适用于低功耗设备。

3. QoS(服务质量)支持

DDS

  • DDS 提供了 22 种 QoS 策略,可以对实时性、可靠性、资源管理、延迟、传输顺序等进行精细控制。例如:
    • Deadline:设置数据传输的时间期限。
    • Latency Budget:定义通信的延迟预算。
    • Reliability:支持可靠传输(可靠模式)或最佳传输(不保证消息到达)。
    • Durability:支持数据的持久化,确保新订阅者可以获得历史数据。
  • DDS 的 QoS 机制非常灵活,适用于复杂场景。

MQTT

  • MQTT 提供了 3 种简单的 QoS 等级:
    1. QoS 0:消息最多发送一次,不保证到达。
    2. QoS 1:消息至少发送一次,可能重复。
    3. QoS 2:消息保证仅发送一次,且不会重复(最可靠)。
  • QoS 机制相对简单,主要适用于低复杂度的 IoT 场景。

4. 性能对比

DDS

  • 由于 DDS 是去中心化的,通信路径更短,通常具有 低延迟、高吞吐量 的特性。
  • 支持 实时性高可靠性,适合对延迟、抖动敏感的场景(如无人机控制、工业机器人)。
  • 性能依赖于网络和硬件环境,在高性能网络中表现极为出色。

MQTT

  • MQTT 由于采用中心化架构,通信性能受 Broker 服务器 的影响。
  • 适合 低带宽网络高延迟环境,但在实时性要求高的场景中表现不如 DDS。
  • 消耗资源少,非常适合低功耗设备。

5. 使用场景

DDS

  • 工业自动化:实时监控和控制(如工厂设备间通信)。
  • 航空航天:飞行器传感器数据共享、控制系统。
  • 机器人:机器人操作系统(如 ROS 2 的通信层基于 DDS)。
  • 汽车:自动驾驶汽车的传感器融合、车辆间通信。
  • 国防领域:分布式作战系统、军事仿真。

MQTT

  • 物联网 (IoT):智能家居、智能农业、环境监测。
  • 移动应用:即时消息、状态更新。
  • 远程监控:设备状态上传、警报通知。
  • 能源管理:智能电网监测。
  • 智能交通:传感器数据上传、车辆定位。

6. 易用性与学习曲线

DDS

  • DDS 功能强大,但 API 和配置相对复杂,学习曲线较陡。
  • 开发和调试 DDS 应用需要对 QoS 策略和分布式系统有较深入的了解。
  • 多数 DDS 实现(如 RTI Connext DDS)提供大量工具和文档,但仍需要较高的专业技能。

MQTT

  • MQTT 设计简单,易于上手,开发和部署快速。
  • 客户端实现轻量,适合嵌入式和低功耗设备。
  • 由于依赖 Broker,部署和管理集中化。

7. 开源实现

DDS

  • 常见的 DDS 实现包括:
    • RTI Connext DDS(商业版,功能强大)
    • OpenDDS(开源,Apache 2.0 许可证)
    • Eclipse Cyclone DDS(开源,Eclipse 基金会维护)
    • Fast-DDS(以前称为 FastRTPS,开源,eProsima 提供)
  • 这些实现通常支持多种编程语言(C++、Java、Python 等)。

MQTT

  • 常见的 MQTT Broker:
    • Mosquitto(开源,轻量级)
    • EMQX(开源,高性能,支持分布式部署)
    • HiveMQ(商业版,支持企业级功能)
    • VerneMQ(开源,支持大规模连接)
  • MQTT 客户端库也非常丰富,几乎支持所有主流语言。

8. 总结对比

特性DDSMQTT
架构去中心化(Brokerless)中心化(需要 Broker)
实时性高实时性,低延迟针对低带宽、高延迟环境
QoS复杂且灵活(22 种 QoS 策略)简单(3 种 QoS 等级)
适用场景工业自动化、航空航天、机器人等IoT、智能家居、移动应用等
学习曲线较陡,需要较高专业技能简单,快速上手
性能高吞吐量、低延迟适合低功耗和高延迟网络

总结

  • 如果你的项目需要 实时性、高可靠性、复杂 QoS,并且运行在高性能网络中,例如工业自动化或机器人控制,DDS 是更好的选择
  • 如果你的项目需要 轻量、低功耗、简单消息传递,运行在低带宽或不可靠的网络中,例如物联网设备或智能家居,MQTT 是更适合的选择

相关文章:

C++中间件DDS介绍

C DDS 库简介 DDS&#xff08;Data Distribution Service&#xff09; 是一种用于实时分布式系统通信的中间件标准&#xff0c;由 OMG&#xff08;Object Management Group&#xff09; 提出。它是一种发布/订阅&#xff08;Publish/Subscribe&#xff09;模式的数据通信框架&…...

强化学习笔记

强化学习的总体目标&#xff1a;寻找最优策略。 关键名词 智能体&#xff08;Agent&#xff09; 状态&#xff08;State&#xff09;&#xff1a;智能体相对于环境的状态 s ∈ S s∈S s∈S 状态空间&#xff08;State space&#xff09;&#xff1a;把所有状态放在一起&…...

【个人记录】openEuler安装K3S并配置为GPU节点

前言 国内网络环境特殊&#xff0c;在线安装比较麻烦&#xff0c;K3S采用离线安装方式进行部署。 安装整体思路是&#xff1a; 安装GPU驱动安装CUDA工具安装nvidia容器运行时安装K3S设置K3S使用GPU 基础环境 采用All In One方式&#xff08;其实只有一张GPU卡&#xff09;部…...

SpringAI系列 - ToolCalling篇(二) - 如何设置应用侧工具参数ToolContext(有坑)

目录 一、引言二、集成ToolContext示例步骤1: 在`@Tool`标注的工具方法中集成`ToolConext`参数步骤2:`ChatClient`运行时动态设置`ToolContext`参数三、填坑一、引言 在使用AI大模型的工具调用机制时,工具参数都是由大模型解析用户输入上下文获取的,由大模型提供参数给本地…...

Linux系统中常见的词GNU是什么意思?

GNU 是 “GNU’s Not Unix” 的递归缩写&#xff0c;它是一个自由软件项目&#xff0c;旨在创建一个完全自由的操作系统。这个名字反映了GNU项目的核心理念&#xff1a;它试图创建一个类Unix的系统&#xff0c;但不是Unix本身。 GNU 项目由 理查德斯托曼&#xff08;Richard S…...

Revit API:对元素过滤的三点思考

一、为什么要对元素进行过滤&#xff1f; 提高效率&#xff1a;Revit模型可能包含成千上万的元素&#xff0c;直接对所有元素进行操作会非常耗时。通过过滤&#xff0c;可以只选择需要处理的元素&#xff0c;从而提高代码的执行效率。 精准控制&#xff1a;通过过滤&#xff0…...

计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

计算机网络之TCP的可靠传输

上一篇内容可能比较多&#xff0c;显得比较杂乱&#xff0c;这一篇简单总结一下TCP是靠什么实现可靠传输的吧。 校验和 TCP是端到端的传输&#xff0c;由发送方计算校验和&#xff0c;接收方进行验证&#xff0c;目的是为了验证TCP首部和数据在发送过程中没有任何改动&#x…...

linux 驱动编程配置(minis3c2440)

1.介绍 1. 启动过程&#xff1a;启动u-boot------>>启动linux内核----->>挂载根文件系统 2. uboot是一个裸机程序&#xff0c;是一个bootloader&#xff0c;用于启动linux系统以及系统初始化 ubootloader主要完成了哪些任务&#xff1a;1. 初始化异常向量表&a…...

数据库基础1

MySQL在C语言中的操作步骤 C语言操作MySQL的基本流程如下&#xff1a; 引入MySQL头文件初始化MySQL连接连接到MySQL服务器执行SQL语句获取查询结果处理查询结果释放结果集和连接 数据库中有哪些约束规则 1.主键约束 promary key 具有唯一且非空 2.外键约束 foreign key 3.非…...

Redis文档总结

文档&#xff1a;https://redis.com.cn/topics/why-use-redis.html 1.我们为什么一定要用 Redis 呢&#xff1f; 速度快&#xff0c;完全基于内存&#xff0c;使用 C 语言实现&#xff0c;网络层使用 epoll 解决高并发问题&#xff0c;单线程模型避免了不必要的上下文切换及竞争…...

论文笔记(七十二)Reward Centering(二)

Reward Centering&#xff08;二&#xff09; 文章概括摘要2 简单的奖励中心 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arXiv preprint arXiv:2405.0…...

25年2月通信基础知识补充:多普勒频移与多普勒扩展、3GPP TDL信道模型

看文献过程中不断发现有太多不懂的基础知识&#xff0c;故长期更新这类blog不断补充在这过程中学到的知识。由于这些内容与我的研究方向并不一定强相关&#xff0c;故记录不会很深入请见谅。 【通信基础知识补充7】25年2月通信基础知识补充1 一、多普勒频移与多普勒扩展傻傻分不…...

ASUS/华硕无畏16 X1605VA 原厂Win11 22H2系统 工厂文件 带ASUS Recovery恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;带一键恢复&#xff0c;以及机器所有的驱动和软件。 支持型号&#xff1a;X1605VA 系统版本&#xff1a;Windows 11 22H2 文件下载&#xff1a;点击下载 文件格式&#xff1a;工厂文件 安装教程&#x…...

DeepSeek赋能智慧文旅:新一代解决方案,重构文旅发展的底层逻辑

DeepSeek作为一款前沿的人工智能大模型&#xff0c;凭借其强大的多模态理解、知识推理和内容生成能力&#xff0c;正在重构文旅产业的发展逻辑&#xff0c;推动行业从传统的经验驱动向数据驱动、从人力密集型向智能协同型转变。 一、智能服务重构&#xff1a;打造全域感知的智…...

自学FOC系列分享--SVPWM和clark 逆变换及代码实战

自学FOC系列分享--SVPWM和clark 逆变换 1 说在前面2 回顾clarke 和 park的变换和逆变换2.1 概述2.2 公式说明 3 SVPWM是如何写的3.1 简单说明3.2 重要对比 4、代码实战4.1 代码构成说明4.2 全部代码4.3 测试代码4.4 测试结果4.5 结果分析 总结 1 说在前面 如前一篇文章所述的系…...

LeetCode-524. 通过删除字母匹配到字典里最长单词

1、题目描述&#xff1a; 给你一个字符串 s 和一个字符串数组 dictionary &#xff0c;找出并返回 dictionary 中最长的字符串&#xff0c;该字符串可以通过删除 s 中的某些字符得到。 如果答案不止一个&#xff0c;返回长度最长且字母序最小的字符串。如果答案不存在&#x…...

浅谈网络 | 容器网络之Cilium

目录 Cilium介绍Cilium是什么Cilium 主要功能特性为什么用Cilium&#xff1f; 功能概述组件概况BPF 与 XDPeBPF (Extended Berkeley Packet Filter)XDP (eXpress Data Path) Cilium介绍 Cilium是什么 Cilium 是一个开源网络和安全项目&#xff0c;专为 Kubernetes、Docker 和…...

armv7l

在 **ARMv7l** 中&#xff0c;最后的字符是字母 **“l”**&#xff08;小写字母 “L”&#xff09;&#xff0c;而不是数字 **“1”**。 --- ### 1. **ARMv7l 的含义** - **ARMv7**&#xff1a;指的是 **ARM 架构的第 7 代版本**&#xff0c;是一种广泛应用于嵌入式系统&…...

从零开始构建一个小型字符级语言模型的完整详细教程(基于Transformer架构)

最近特别火的DeepSeek,是一个大语言模型,那一个模型是如何构建起来的呢?DeepSeek基于Transformer架构,接下来我们也从零开始构建一个基于Transformer架构的小型语言模型,并说明构建的详细步骤及内部组件说明。我们以构建一个字符级语言模型(Char-Level LM)为例,目标是通…...

期权帮|股指期货交割日为啥会大跌?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 股指期货交割日为啥会大跌&#xff1f; 股指期货交割日股市可能会大跌&#xff0c;主要原因有以下几点&#xff1a; 1.交割日时多空双方需要平仓或转仓&#xff0c;若多头急于平仓…...

B树和B+树

1. B树 1.1 定义 B树是一种多路平衡查找树&#xff0c;具有以下性质&#xff1a; 每个节点最多包含 m 个子节点&#xff08;m 阶 B树&#xff09;。 根节点至少有两个子节点&#xff08;除非它是叶子节点&#xff09;。 每个内部节点&#xff08;非根和非叶子节点&#xff…...

分布式事务核心理论:CAP与BASE

一、引言&#xff1a;分布式系统的挑战 在互联网应用中&#xff0c;随着业务规模的扩大&#xff0c;单机数据库已无法满足高并发和海量数据存储需求。分布式系统将数据拆分到不同节点&#xff0c;但随之带来了数据一致性的难题。CAP与BASE理论为分布式事务提供了重要的设计指导…...

【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记

本文内容为重写上一节课中的单链表&#xff0c;将其重构成更易于用户使用的链表&#xff0c;实现多种操作链表的方法。 1. 重构单链表SLList 在上一节课中编写的 IntList 类是裸露递归的形式&#xff0c;在 Java 中一般不会这么定义&#xff0c;因为这样用户可能需要非常了解…...

记录一个ES分词器不生效的解决过程

问题背景 商城项目,其中商品查询检索使用的是ES, 但存在某些商品查询不到的问题 例如:某商品名包含AA_BBB这样的关键词,但是搜索"AA"不能查询到该商品,但是将商品名修改为AA BBB后就能查询到了. 怀疑是分词的问题,但看代码,在创建ES索引时在对应字段上也定义了分词器…...

Jeecg+vue3去掉JInput组件默认模糊查询的配置方式

遇见的问题&#xff1a;input查询带**号 情况1、使用schemas配置的表单项 添加type""属性&#xff0c;默认type为like&#xff0c;去掉模糊则配置为空 文档链接 jeecg文档说明JInput 2、直接调用组件则在属性上直接添加type""属性...

Could not initialize class io.netty.util.internal.Platfor...

异常信息&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.internal.PlatformDependent0 Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjec…...

什么是业务流程分类框架

业务流程分类框架是一个用于组织和系统化地分类业务流程的结构化方法。它旨在帮助企业理解、管理、分析和改进其运营流程。 可以把它想象成一个图书馆的图书分类系统&#xff0c;帮助快速找到和理解不同类型的书籍。对于业务流程来说&#xff0c;分类框架帮助快速了解不同类型的…...

向量的点乘的几何意义

源自AI 向量的点乘&#xff08;Dot Product&#xff09;在几何和图形学中有重要的意义。它不仅是数学运算&#xff0c;还可以用来描述向量之间的关系。以下是点乘的几何意义及其应用&#xff1a; 1. 点乘的定义 对于两个向量 a 和 b&#xff0c;它们的点乘定义为&#xff1a;…...

达梦数据库应用开发_JDBC接口介绍_yxy

达梦数据库应用开发_JDBC接口介绍 1 JDBC是什么&#xff1f;2 JDBC主要类或接口介绍2.1 建立与 DM 数据库的连接2.2 转接发送 SQL 语句到数据库2.3 处理并返回语句执行结果 3 JDBC基本使用3.1 前期准备3.2 增删改查代码示例3.3 绑定变量操作示例3.4 大字段操作示例 1 JDBC是什么…...

在ubuntu上用Python的openpyxl模块操作Excel的案例

文章目录 安装模块读取Excel数据库取数匹配数据和更新Excel数据 在Ubuntu系统的环境下基本职能借助Python的openpyxl模块实现对Excel数据的操作。 安装模块 本次需要用到的模块需要提前安装(如果没有的话) pip3 install openpyxl pip3 install pymysql在操作前&#xff0c;需…...

RabbitMQ介绍以及基本使用

文章目录 一、什么是消息队列&#xff1f; 二、消息队列的作用&#xff08;优点&#xff09; 1、解耦 2、流量削峰 3、异步 4、顺序性 三、RabbitMQ基本结构 四、RabbitMQ队列模式 1、简单队列模式 2、工作队列模式 3、发布/订阅模式 4、路由模式 5、主题模式 6、…...

搭建 Hadoop 3.3.6 伪分布式

搭建 Hadoop 3.3.6 伪分布式 IP 192.168.157.132 初始化操作 更改yum源 # 1_1.安装Wget yum install wget# 1_2.备份CentOS-Base.repo文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak# 2.下载阿里yum源配置 wget -O /etc/yum.repos.d/Cen…...

进程控制(靠原语实现)

什么是进程控制&#xff1f; 进程控制的主要功能是&#xff1a;对系统中的所有进程实施有效管理&#xff0c;它具有创建新进程、撤销已有进程、实现进程状态转换等功能。 简化理解&#xff1a;进程控制就是要实现进程状态转换。 知识一览&#xff1a; 如何实现进程控制&#…...

linux5-多任务--进程fork()

一.多任务&#xff1a;让系统具备同时处理多个任务的能力 1.如何实现多任务 1.1进程&#xff1a;操作系统上正在运行的程序&#xff0c;需要消耗内存和CPU 1.1.1 进程的生存周期&#xff1a;创建、调度、消亡 1.1.1.1进程的创建&#xff1a;每个进程被创建时&#xff0c;操作…...

【蓝桥】二分法

1、简介 1.1 定义&#xff1a; 通过将问题的搜索范围一分为二&#xff0c;迭代地缩小搜索范围&#xff0c;直到找到目标或确定目标不存在 1.2 适用&#xff1a; 有序数据集合&#xff0c;且每次迭代可以将搜索范围缩小一半 1.3 本质&#xff1a; 枚举&#xff1a;利用数据结构…...

linux查看程序占用的本地端口

ss是Socket Statistics的缩写&#xff0c;用来替代旧的netstat工具&#xff0c;功能更强大&#xff0c;执行更快。它用于查看系统的网络连接情况&#xff0c;包括TCP、UDP等协议的信息。 一. 命令解析&#xff1a; sudo ss -tulwnpss (Socket Statistics)&#xff1a;替代 ne…...

统计函数运行时间的python脚本

这是一个统计函数运行时间的实用脚本&#xff0c;其中用到了函数的嵌套、链式传输参数&#xff0c;以及修饰器。 import time# 定义一个装饰器timer&#xff0c;用于计算被装饰函数的运行时间 def timer(func):print("执行了timer")def wrapper(*args, **kwargs):st…...

百度搜索和文心智能体接入DeepSeek满血版——AI搜索的新纪元

在当今数字化时代&#xff0c;搜索引擎作为互联网信息获取的核心工具&#xff0c;正经历着前所未有的变革。据悉&#xff0c;2025年2月16日&#xff0c;百度搜索和文心智能体平台宣布全面接入DeepSeek和文心大模型的最新深度搜索功能&#xff0c;搜索用户可免费使用DeepSeek和文…...

快速入门Springboot+vue——MybatisPlus快速上手

学习自哔哩哔哩上的“刘老师教编程”&#xff0c;具体学习的网站为&#xff1a;6.MybatisPlus快速上手_哔哩哔哩_bilibili&#xff0c;以下是看课后做的笔记&#xff0c;仅供参考。 第一节 ORM介绍 ORM对象关系映射&#xff0c;为了解决面向对象与关系数据库存在的互补匹配现象…...

在C#中动态访问对象属性时,用表达式树可以获得高效性能

在C#中如何用表达式树动态访问对象属性的问题。用户可能已经知道反射的基本用法&#xff0c;但想用表达式树来提高性能&#xff0c;因为表达式树编译后的委托执行速度比反射快。 首先&#xff0c;表达式树的基本概念。表达式树允许在运行时构建代码&#xff0c;并编译成可执行的…...

性能:React 实战优化技巧 之 函数闭包

子组件使用了 React.memo &#xff0c;为什么 “prop 值未发生改变”&#xff0c;子组件依然被重新渲染了&#xff1f; &#x1f6a7; 示例&#xff1a;点击子组件中按钮&#xff0c;获取 input 数据进行提交&#xff08;常见于表单&#xff09; index.tsx import Author f…...

蓝桥杯学习大纲

&#xff08;致酷德与热爱算法、编程的小伙伴们&#xff09; 在查阅了相当多的资料后&#xff0c;发现没有那篇博客、文章很符合我们备战蓝桥杯的学习路径。所以&#xff0c;干脆自己整理一篇&#xff0c;欢迎大家补充&#xff01; 一、蓝桥必备高频考点 我们以此为重点学习…...

Windows11切换回Windows10风格右键菜单

参考文章&#xff1a;Win11新版右键菜单用不惯&#xff1f;一键切换回Win10经典版&#xff01;-CSDN博客 以管理员权限运行命令行cmd 切换为经典旧版右键菜单&#xff0c;执行 reg.exe add “HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServe…...

Python 爬虫selenium

1.selenium自动化 selenium可以操作浏览器&#xff0c;在浏览器页面上实现&#xff1a;点击、输入、滑动 等操作。 不同于selenium自动化&#xff0c;逆向本质是&#xff1a; 分析请求&#xff0c;例如&#xff1a;请求方法、请求参数、加密方式等。用代码模拟请求去实现同等…...

Linux常用操作

软件安装 CentOS系统使用: yum [install remove search] [-y] 软件名称 install 安装 remove 卸载 search 搜索 -y,自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装 remove 卸载 search 搜索 -y,自动确认 yum 和 apt 均需要root权限 syste…...

Note25022001_Excel表格如何在文字的中间或者后边插入当前日期

Excel表格如何在文字的中间或者后边插入当前日期 关键字&#xff1a; EXCEL&#xff1b;当前日期&#xff1b;文字中间 如图所示&#xff1a; 其中一种实现方法如下&#xff1a; 打开表格&#xff0c;在某一个表格中输入&#xff1a; "项目计划管理表&#xff08;厂内&…...

Django5 实用指南(四)URL路由与视图函数

4.1 Django5的URL路由系统 Django 的 URL 路由系统是其核心组件之一&#xff0c;它负责将用户的 HTTP 请求&#xff08;即 URL&#xff09;映射到相应的视图函数上。每当用户在浏览器中访问某个 URL 时&#xff0c;Django 会根据项目的 URL 配置文件&#xff08;urls.py&#…...

Unity3D 基于 GPU 动画和 Compute Shader 的大批量动画渲染详解

引言 在现代游戏开发中&#xff0c;渲染大量动画角色是一个常见的需求&#xff0c;尤其是在大规模战斗场景、开放世界游戏或 VR/AR 应用中。传统的 CPU 动画计算和渲染方式在面对大批量角色时&#xff0c;往往会遇到性能瓶颈。为了优化性能&#xff0c;开发者可以利用 GPU 的强…...

遥感影像目标检测:从CNN(Faster-RCNN)到Transformer(DETR)

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…...