C++实现rabbitmq生产者消费者
RabbitMQ是一个开源的消息队列系统,它实现了高级消息队列协议(AMQP),
特点
- 可靠性:通过持久化、镜像队列等机制保证消息不丢失,确保消息可靠传递。
- 灵活的路由:提供多种路由方式,如直连、主题、扇形等,可根据不同的业务需求进行灵活配置。
- 多语言支持:支持多种编程语言,如Java、Python、C++、Ruby等,方便不同技术栈的开发者使用。
- 高可用性:可以通过集群方式实现高可用性,避免单点故障,保证系统的稳定运行。
- 易于管理:提供了可视化的管理界面,方便管理员对队列、交换机、消息等进行监控和管理。
核心概念
- 消息:应用程序之间传递的数据单元。
- 队列:用于存储消息的缓冲区,消息会在队列中等待消费者来获取。
- 交换机:接收生产者发送的消息,并根据路由键将消息路由到相应的队列。
- 绑定:将交换机和队列通过路由键进行关联,建立路由规则。
- 生产者:负责发送消息到RabbitMQ服务器的应用程序。
- 消费者:从RabbitMQ服务器获取消息并进行处理的应用程序。
工作原理
- 生产者将消息发送到交换机,消息中包含路由键等信息。
- 交换机根据路由键和绑定规则,将消息路由到对应的队列。
- 消费者从队列中获取消息并进行处理。
应用场景
- 异步处理:将一些耗时的操作如发送邮件、生成报表等放在消息队列中,由消费者异步处理,提高系统的响应速度。
- 系统解耦:不同模块之间通过消息队列进行通信,降低模块之间的耦合度,使得各个模块可以独立扩展和维护。
- 流量削峰:在高并发场景下,将大量的请求放入消息队列中,由消费者按照一定的速度进行处理,避免系统因瞬间高流量而崩溃。
C++实现rabbitmq生产者消费者
// MFCRABBITMQDlg.h: 头文件
//#pragma once
#include <iostream>
#include <string>
#include <amqp.h>
#include <amqp_tcp_socket.h>
#pragma comment(lib , "rabbitmq.lib")// CMFCRABBITMQDlg 对话框
class CMFCRABBITMQDlg : public CDialogEx
{
// 构造
public:CMFCRABBITMQDlg(CWnd* pParent = nullptr); // 标准构造函数// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_MFCRABBITMQ_DIALOG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现
protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:afx_msg void OnBnClickedButtonProduct();void CMFCRABBITMQDlg::sendMessageToRabbitMQ(const std::string& message);void CMFCRABBITMQDlg::receiveMessagesFromRabbitMQ();afx_msg void OnBnClickedButtonConsumer();void CMFCRABBITMQDlg::showLog(CString p_str_log);CString m_CstrLog;CEdit m_ctrlLog;
};
// MFCRABBITMQDlg.cpp: 实现文件
//#include "pch.h"
#include "framework.h"
#include "MFCRABBITMQ.h"
#include "MFCRABBITMQDlg.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// CMFCRABBITMQDlg 对话框CMFCRABBITMQDlg::CMFCRABBITMQDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_MFCRABBITMQ_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CMFCRABBITMQDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_EDIT_LOG, m_ctrlLog);
}BEGIN_MESSAGE_MAP(CMFCRABBITMQDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_PRODUCT, &CMFCRABBITMQDlg::OnBnClickedButtonProduct)ON_BN_CLICKED(IDC_BUTTON_CONSUMER, &CMFCRABBITMQDlg::OnBnClickedButtonConsumer)
END_MESSAGE_MAP()// CMFCRABBITMQDlg 消息处理程序BOOL CMFCRABBITMQDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标// TODO: 在此添加额外的初始化代码return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}void CMFCRABBITMQDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。void CMFCRABBITMQDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCRABBITMQDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CMFCRABBITMQDlg::sendMessageToRabbitMQ(const std::string& message)
{amqp_connection_state_t conn;amqp_socket_t* socket = NULL;int status;// 初始化连接conn = amqp_new_connection();socket = amqp_tcp_socket_new(conn);if (!socket) {std::cerr << "Failed to create TCP socket" << std::endl;return;}// 连接到 RabbitMQ 服务器status = amqp_socket_open(socket, "localhost", 5672);if (status) {std::cerr << "Failed to open TCP socket" << std::endl;amqp_destroy_connection(conn);return;}// 登录到 RabbitMQ 服务器amqp_rpc_reply_t loginReply = amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, "guest", "guest");if (loginReply.reply_type != AMQP_RESPONSE_NORMAL) {std::cerr << "Failed to login to RabbitMQ" << std::endl;amqp_destroy_connection(conn);return;}// 打开通道amqp_channel_open(conn, 1);amqp_rpc_reply_t openReply = amqp_get_rpc_reply(conn);if (openReply.reply_type != AMQP_RESPONSE_NORMAL) {std::cerr << "Failed to open channel" << std::endl;amqp_destroy_connection(conn);return;}// 声明队列amqp_queue_declare(conn, 1, amqp_cstring_bytes("my_queue"), 0, 0, 0, 0, amqp_empty_table);amqp_rpc_reply_t queueDeclareReply = amqp_get_rpc_reply(conn);if (queueDeclareReply.reply_type != AMQP_RESPONSE_NORMAL) {std::cerr << "Failed to declare queue" << std::endl;amqp_destroy_connection(conn);return;}// 发布消息到队列amqp_basic_properties_t props;props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG | AMQP_BASIC_DELIVERY_MODE_FLAG;props.content_type = amqp_cstring_bytes("text/plain");props.delivery_mode = 2; // 持久化消息amqp_basic_publish(conn,1,amqp_cstring_bytes(""), // 默认交换器amqp_cstring_bytes("my_queue"),0,0,&props,amqp_cstring_bytes(message.c_str()));// 检查发布结果amqp_rpc_reply_t publishReply = amqp_get_rpc_reply(conn);if (publishReply.reply_type != AMQP_RESPONSE_NORMAL) {std::cerr << "Failed to publish message" << std::endl;}else {std::cout << "Message sent: " << message << std::endl;}// 关闭通道和连接amqp_channel_close(conn, 1, AMQP_REPLY_SUCCESS);amqp_connection_close(conn, AMQP_REPLY_SUCCESS);amqp_destroy_connection(conn);
}void CMFCRABBITMQDlg:: receiveMessagesFromRabbitMQ()
{amqp_connection_state_t conn;amqp_socket_t* socket = NULL;int status;// 初始化连接conn = amqp_new_connection();socket = amqp_tcp_socket_new(conn);if (!socket) {std::cerr << "Failed to create TCP socket" << std::endl;return;}// 连接到 RabbitMQ 服务器status = amqp_socket_open(socket, "localhost", 5672);if (status) {std::cerr << "Failed to open TCP socket" << std::endl;amqp_destroy_connection(conn);return;}// 登录到 RabbitMQ 服务器amqp_rpc_reply_t loginReply = amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, "guest", "guest");if (loginReply.reply_type != AMQP_RESPONSE_NORMAL) {std::cerr << "Failed to login to RabbitMQ" << std::endl;amqp_destroy_connection(conn);return;}// 打开通道amqp_channel_open(conn, 1);amqp_rpc_reply_t openReply = amqp_get_rpc_reply(conn);if (openReply.reply_type != AMQP_RESPONSE_NORMAL) {std::cerr << "Failed to open channel" << std::endl;amqp_destroy_connection(conn);return;}// 声明队列amqp_queue_declare(conn, 1, amqp_cstring_bytes("my_queue"), 0, 0, 0, 0, amqp_empty_table);amqp_rpc_reply_t queueDeclareReply = amqp_get_rpc_reply(conn);if (queueDeclareReply.reply_type != AMQP_RESPONSE_NORMAL) {std::cerr << "Failed to declare queue" << std::endl;amqp_destroy_connection(conn);return;}// 开始消费消息amqp_basic_consume(conn, 1, amqp_cstring_bytes("my_queue"), amqp_empty_bytes, 0, 1, 0, amqp_empty_table);amqp_rpc_reply_t consumeReply = amqp_get_rpc_reply(conn);if (consumeReply.reply_type != AMQP_RESPONSE_NORMAL) {std::cerr << "Failed to start consuming messages" << std::endl;amqp_destroy_connection(conn);return;}std::cout << "Waiting for messages. To exit press CTRL+C" << std::endl;showLog(_T("消费者开始监听:"));while (true) {amqp_rpc_reply_t reply;amqp_envelope_t envelope;amqp_maybe_release_buffers(conn);reply = amqp_consume_message(conn, &envelope, NULL, 0);if (AMQP_RESPONSE_NORMAL != reply.reply_type) {break;}static int t_count = 0;t_count++;std::cout << "Received message: ";char* p1 = static_cast<char*>(envelope.message.body.bytes);char* p = new char[envelope.message.body.len+1]();// strcpy_s(p , envelope.message.body.len, "11");for (size_t i = 0; i < envelope.message.body.len; ++i){p[i] = p1[i];}std::cout << std::endl;CString t_Cstr = (CString)p;CString t_CstrCount;t_CstrCount.Format(_T("%d ->"), t_count);CString t_tep = t_CstrCount + t_Cstr;showLog(t_tep);delete[]p;amqp_destroy_envelope(&envelope);}// 关闭通道和连接amqp_channel_close(conn, 1, AMQP_REPLY_SUCCESS);amqp_connection_close(conn, AMQP_REPLY_SUCCESS);amqp_destroy_connection(conn);
}// ch:取流线程 | en:Grabbing thread
unsigned int __stdcall SendThread(void* pUser)
{if (pUser){CMFCRABBITMQDlg* Gthis = (CMFCRABBITMQDlg*)pUser;CString t_CstrSend;for (int i = 0; i < 1000000; ++i){Gthis->GetDlgItemText(IDC_EDIT_TEXT, t_CstrSend);std::string t_strSend = (CT2A)t_CstrSend;Gthis->sendMessageToRabbitMQ(t_strSend);Sleep(1);}return 0;}return -1;
}void CMFCRABBITMQDlg::OnBnClickedButtonProduct()
{unsigned int nThreadID = 0;void* m_hGrabThread = (void*)_beginthreadex(NULL, 0, SendThread, this, 0, &nThreadID);if (NULL == m_hGrabThread){showLog(_T("消费者创建线程失败"));return;}}// ch:取流线程 | en:Grabbing thread
unsigned int __stdcall ConsumThread(void* pUser)
{if (pUser){CMFCRABBITMQDlg* Gthis = (CMFCRABBITMQDlg*)pUser;Gthis->receiveMessagesFromRabbitMQ();return 0;}return -1;
}void CMFCRABBITMQDlg::OnBnClickedButtonConsumer()
{unsigned int nThreadID = 0;void* m_hGrabThread = (void*)_beginthreadex(NULL, 0, ConsumThread, this, 0, &nThreadID);if (NULL == m_hGrabThread){showLog(_T("消费者创建线程失败"));return;}
}void CMFCRABBITMQDlg::showLog(CString p_str_log)
{int t_intLine = m_ctrlLog.GetLineCount();if (t_intLine == 1000){m_CstrLog = _T("");}SYSTEMTIME timeCur;GetLocalTime(&timeCur);char t_logbuffer[1024] = { 0 };sprintf_s(t_logbuffer, ("[%04d%02d%02d_%02d:%02d:%02d:%03d] "), timeCur.wYear, timeCur.wMonth, timeCur.wDay, timeCur.wHour, timeCur.wMinute, timeCur.wSecond, timeCur.wMilliseconds);p_str_log += "\r\n";m_CstrLog += t_logbuffer;m_CstrLog += p_str_log;m_ctrlLog.SetWindowTextW(m_CstrLog);m_ctrlLog.LineScroll(m_ctrlLog.GetLineCount() - 1, 0);}

相关文章:
C++实现rabbitmq生产者消费者
RabbitMQ是一个开源的消息队列系统,它实现了高级消息队列协议(AMQP), 特点 可靠性:通过持久化、镜像队列等机制保证消息不丢失,确保消息可靠传递。灵活的路由:提供多种路由方式,如…...
在VMware上部署【Ubuntu】
镜像下载 国内各镜像站点均可下载Ubuntu镜像,下面例举清华网站 清华镜像站点:清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体下载步骤如下: 创建虚拟机 准备:在其他空间大的盘中创建存储虚拟机的目录,…...
【Pandas】pandas Series plot.barh
Pandas2.2 Series Plotting 方法描述Series.plot([kind, ax, figsize, …])用于绘制 Series 对象的数据可视化图表Series.plot.area([x, y, stacked])用于绘制堆叠面积图(Stacked Area Plot)Series.plot.bar([x, y])用于绘制垂直条形图(Ver…...
检索增强生成(2)本地PDF 本地嵌入模型
from langchain_community.document_loaders import PyPDFLoader from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在!")loader PyPDFLoader(file_path)try:do…...
又双叒叕Scrapy爬虫相关的面试题及详细解答
Scrapy是Python开发的一个快速、高层次的网络爬虫框架,专注于高效抓取网页并提取结构化数据。其核心设计基于异步处理机制,适合大规模数据采集任务。 文章目录 基础概念1. Scrapy框架的核心组件有哪些?架构与流程2. 描述Scrapy的工作流程核心组件详解3. 如何自定义Item Pipe…...
【QA】装饰模式在Qt中有哪些运用?
在Qt框架中,装饰模式(Decorator Pattern)主要通过继承或组合的方式实现,常见于IO设备扩展和图形渲染增强场景。以下是Qt原生实现的装饰模式典型案例: 一、QIODevice装饰体系(继承方式) 场景 …...
【保姆级】阿里云codeup配置Git的CI/CD步骤
以下是通过阿里云CodeUp的Git仓库进行CI/CD配置的详细步骤,涵盖前端(Vue 3)和后端(Spring Boot)项目的自动化打包,并将前端打包结果嵌入到Nginx的Docker镜像中,以及将后端打包的JAR文件拷贝至Do…...
使用STM32CubeMX+DMA+空闲中断实现串口接收和发送数据(STM32G070CBT6)
1.STM32CubeMX配置 (1)配置SYS (2)配置RCC (3)配置串口,此处我用的是串口4,其他串口也是一样的 (4)配置DMA,将串口4的TX和RX添加到DMA中 &#…...
【视觉提示学习】3.21论文随想
. . Frontiers of Information Technology & Electronic Engineering. 2024, 25(1): 42-63 https://doi.org/10.1631/FITEE.2300389 中文综述,根据里面的架构,把视觉提示学习分成两类,一类是单模态提示学习(以vit为代表&…...
(一)丶Windows安装RabbitMQ可能会遇到的问题
一丶可能会忘了配置ERLang的环境变量 二丶执行命令时报错 第一步 rabbitmq-plugins enable rabbitmq_management 第二部 rabbitmqctl status 三丶修改.erlang.cookie 文件 1.找到C盘目下的.erlang.cookie文件 C:\Users\admin\.erlang.cookie C:\Windows\System32\config\sys…...
Mistral AI发布开源多模态模型Mistral Small 3.1:240亿参数实现超越GPT-4o Mini的性能
法国人工智能初创公司Mistral AI于2025年3月正式推出新一代开源模型Mistral Small 3.1 ,该模型凭借240亿参数的轻量级设计,在多项基准测试中表现优异,甚至超越了Google的Gemma 3和OpenAI的GPT-4o Mini等主流专有模型。 1、核心特性与优势 多…...
如何在IPhone 16Pro上运行python文件?
在 iPhone 16 Pro 上运行 Python 文件需要借助第三方工具或远程服务,以下是具体实现方法和步骤: 一、本地运行方案(无需越狱) 使用 Python 编程类 App 以下应用可在 App Store 下载,支持直接在 iPhone 上编写并运行 …...
springboot整合mybatis-plus【详细版】
目录 一,简介 1. 什么是mybatis-plus2.mybatis-plus特点 二,搭建基本环境 1. 导入基本依赖:2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三,基本知识介绍 1. 基本注解 T…...
视频剪辑行业的现状与进阶之路:一个双视角分析
视频剪辑行业的现状与进阶之路:一个双视角分析 一、现状解析 商业角度分析 成本控制 培训需要投入时间和人力成本 快节奏的市场环境要求快速产出 人员流动性大,培训投入可能无法获得长期回报 市场需求 大量内容需要快速产出 标准化的剪辑模板更容易管理 …...
k近邻图(knn-graph)和局部线性嵌入图(LLE-graph)的相似性和区别
K 近邻图(KNN - graph)和局部线性嵌入图(LLE - graph)是用于构建数据点之间关系图的两种方法。 1. k近邻图(knn-graph) 核心思想:k近邻图通过计算样本之间的距离来构建图。具体来说,…...
Qt之MVC架构MVD
什么是MVC架构: MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controll…...
使用 Apktool 反编译、修改和重新打包 APK
使用 Apktool 反编译、修改和重新打包 APK 在 Android 逆向工程和应用修改过程中,apktool 是一个强大的工具,它允许我们解包 APK 文件、修改资源文件或代码,并重新打包成可安装的 APK 文件。本文将介绍如何使用 apktool 进行 APK 反编译、修…...
深度解析学术论文成果评估(Artifact Evaluation):从历史到现状
深度解析学术论文成果评估(Artifact Evaluation):从历史到现状 引言 在计算机科学和工程领域的学术研究中,可重复性和可验证性越来越受到重视。随着实验性研究的复杂性不断增加,确保研究成果可以被其他研究者验证和构建变得尤为重要。这一需…...
二分查找上下界问题的思考
背景 最近在做力扣hot100中的二分查找题目时,发现很多题目都用到了二分查找的变种问题,即二分查找上下界问题,例如以下题目: 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置 它们不同于查找…...
关于FastAPI框架的面试题及答案解析
FastAPl是一个现代、快速(高性能)的Web框架,用于构建API,基于Python3.7+的类型提示功能。它由Python开发者SebastianRamirez创建,并且使用了Starlette作为其核心组件以及Pydantic进行数据验证。 文章目录 基础篇1. FastAPI的核心优势是什么?2. 如何定义一个GET请求路由?…...
Ubuntu检查并启用 Nginx 的stream模块或重新安装支持stream模块的Nginx
stream 模块允许 Nginx 处理 TCP 和 UDP 流量,常用于负载均衡和端口转发等场景。本文将详细介绍如何检查 Nginx 是否支持 stream 模块,以及在需要时如何启用该模块。 1. 检查 Nginx 是否支持 stream 模块 首先,需要确认当前安装的 Nginx 是…...
HashMap添加元素的流程图
文章目录 JDK7 vs JDK8 的 HashMap 结构变化Java8 中哈希表的红黑树优化机制HashMap 添加元素的完整流程解析1. 计算 key 的哈希值并确定索引2. 检查该索引位置是否已有元素3. 处理哈希冲突4. 判断当前存储结构(链表还是红黑树)5. 判断链表长度是否超过 …...
(八)Set 的使用
Set 的使用 Set 的特点 主要功能:去除重复内容。特性:无序且不支持重复的集合,不能通过索引访问元素。 示例代码 void main() {// 创建一个包含重复元素的列表List<String> fruits [香蕉, 苹果, 西瓜, 香蕉, 苹果, 香蕉, 苹果];//…...
Spring Boot 集成 Kafka 消息发送方案
一、引言 在 Spring Boot 项目中,Kafka 是常用的消息队列,可实现高效的消息传递。本文介绍三种在 Spring Boot 中使用 Kafka 发送消息的方式,分析各自优缺点,并给出对应的 pom.xml 依赖。 二、依赖引入 在 pom.xml 中添加以下依赖: <dependencies><!-- Sprin…...
面向医药仓储场景下的药品分拣控制策略方法 研究(大纲)
面向医药仓储场景下的药品分拣控制策略方法研究 基于多机器人协同与智能调度的分拣系统设计 第一章 绪论 1.1 研究背景与意义 医药仓储自动化需求: 人工分拣效率低、出错率高(如药品批次混淆、过期风险)温控药品(如疫苗、生物制…...
AI大模型介绍
大模型介绍 大模型是指具有大规模参数和复杂计算结构的机器学习模型,通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数 开发大模型不是从0开始,是建立在已有的大模型基座模型上做开发,构建企业知识库(向量数据库…...
Python日期时间向前向后N个月及对应月初和月末
Python日期和时间的计算主要使用自带的datetime和calendar库,部分需要借助第三方dateutil库。下面具体说明时间的加减运算,月份的起始和结束日期,向前向后移动的时间间隔等,代码如下: from datetime import date, dat…...
OpenPCDet详细部署与复现
OpenPCDet简介 OpenPCDet是一个用于3D目标检测的开源工具箱,它提供了多种数据集的加载器,支持多种模型,并且易于扩展。 本人使用硬件与环境 Linux操作系统(Ubuntu20.04) Python环境(Anaconda下独立创建&…...
同旺科技USB to I2C 适配器 ---- 指令之间延时功能
所需设备: 内附链接 1、同旺科技USB to I2C 适配器 1、指令之间需要延时发送怎么办?循环过程需要延时怎么办?如何定时发送?现在这些都可以轻松解决; 2、只要在 “发送数据” 栏的Delay单元格里面输入相应的延迟时间就…...
网络华为HCIA+HCIP NFV
目录 NFV关键技术:虚拟化 NFV关键技术:云化 NFV架构 NFV标准架构 编辑 NFV架构功能模块 NFV架构接口 NFV关键技术:虚拟化 在NFV的道路上,虚拟化是基础,云化是关键。传统电信网络中,各个网元都是…...
