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

C++负载均衡远程调用学习之负载均衡算法与实现

目录

01 lars 系统架构回顾

02 lars-lbAgentV0.4-route_lb处理report业务流程

03 lars-lbAgentV0.4-负责均衡判断参数配置

04 lars-lbAgentV0.4-负载均衡idle节点的失败率判断

05 lars-lbAgentV0.4-负载均衡overload节点的成功率判断

06 lars-lbAgentV0.4-负载均衡上报提交模块

07 lars-lbAgentV0.4-数据问题修改-上报业务测试

08 lars-lbAgentV0.4-模拟器测试工具

09 lars-lbAgentV0.5-idle连续成功-overload连续失败的定期窗口重置机制

10 lars-lbAgentV0.6-loadbalance主动更新主机信息功能

11 昨日回顾

12 Lars-LbAgentV0.7-GetRouteAPI实现

13 Lars-LbAgentV0.7-Udp-server-获取路由服务业务注册

14 Lars-LbAgentV0.7-Udp-server-API和udpserver的测试


01 lars 系统架构回顾

**启动 Lars Reporter**

```bash
$ ./run_lars reporter
 

        ▄▄                                               
        ██                                               
        ██         ▄█████▄   ██▄████  ▄▄█████▄           
        ██         ▀ ▄▄▄██   ██▀      ██▄▄▄▄ ▀           
        ██        ▄██▀▀▀██   ██        ▀▀▀▀██▄           
        ██▄▄▄▄▄▄  ██▄▄▄███   ██       █▄▄▄▄▄██           
        ▀▀▀▀▀▀▀▀   ▀▀▀▀ ▀▀   ▀▀        ▀▀▀▀▀▀            
    Load balance And Remote service schedule System 
                                                         
        _____                       _                       
       |  __ \                     | |
       | |__) |___ _ __   ___  _ __| |_ ___ _ __
       |  _  // _ \ '_ \ / _ \| '__| __/ _ \ '__|
       | | \ \  __/ |_) | (_) | |  | ||  __/ |
       |_|  \_\___| .__/ \___/|_|   \__\___|_|
                  | |
                  |_|

            ITCAST(https://www.itcast.cn)
         ------------------------------------ 

create 0 thread
create 1 thread
create 2 thread
create 3 thread
create 4 thread
add msg cb msgid = 3
```





**启动 Lars dns**

```bash
$ ./run_lars dns
 

        ▄▄                                               
        ██                                               
        ██         ▄█████▄   ██▄████  ▄▄█████▄           
        ██         ▀ ▄▄▄██   ██▀      ██▄▄▄▄ ▀           
        ██        ▄██▀▀▀██   ██        ▀▀▀▀██▄           
        ██▄▄▄▄▄▄  ██▄▄▄███   ██       █▄▄▄▄▄██           
        ▀▀▀▀▀▀▀▀   ▀▀▀▀ ▀▀   ▀▀        ▀▀▀▀▀▀            
    Load balance And Remote service schedule System 
                                                         
                _____ 
               |  __ \ 
               | |  | |_ __  ___ 
               | |  | | '_ \/ __|
               | |__| | | | \__ \ 
               |_____/|_| |_|___/ 

            ITCAST(https://www.itcast.cn)
         ------------------------------------ 

create 0 thread
create 1 thread
create 2 thread
create 3 thread
create 4 thread
add msg cb msgid = 1
lars dns service ....
now route version is 1574674421
```



**启动 Lars Lb Agent**

```c
$ ./run_lars lbagent

        ▄▄                                               
        ██                                               
        ██         ▄█████▄   ██▄████  ▄▄█████▄           
        ██         ▀ ▄▄▄██   ██▀      ██▄▄▄▄ ▀           
        ██        ▄██▀▀▀██   ██        ▀▀▀▀██▄           
        ██▄▄▄▄▄▄  ██▄▄▄███   ██       █▄▄▄▄▄██           
        ▀▀▀▀▀▀▀▀   ▀▀▀▀ ▀▀   ▀▀        ▀▀▀▀▀▀            
    Load balance And Remote service schedule System 
                                                         
      _      _                                _  
     | |    | |         /\                   | | 
     | |    | |__      /  \   __ _  ___ _ __ | |_ 
     | |    | '_ \    / /\ \ / _` |/ _ \ '_ \| __| 
     | |____| |_) |  / ____ \ (_| |  __/ | | | |_ 
     |______|_.__/  /_/    \_\__, |\___|_| |_|\__| 
                              __/ | 
                             |___/  

            ITCAST(https://www.itcast.cn)
         ------------------------------------ 

```

02 lars-lbAgentV0.4-route_lb处理report业务流程

![4-Lars-agent](./pictures/4-Lars-agent.png)



LB Agent拥有5个线程,一个LB算法:

- UDP Server服务,并运行LB算法,对业务提供节点获取和节点调用结果上报服务;为了增大系统吞吐量,使用3个UDP Server服务互相独立运行LB算法:`modid+cmdid % 3 = i`的那些模块的服务与调度,由第`i+1`个UDP Server线程负责
- Dns Service Client:是dnsserver的客户端线程,负责根据需要,向dnsserver获取一个模块的节点集合(或称为获取路由);UDP Server会按需向此线程的MQ写入获取路由请求,DSS Client将MQ到来的请求转发到dnsserver,之后将dnsserver返回的路由信息更新到对应的UDP Server线程维护的路由信息中
- Report Service Client:是reporter的客户端线程,负责将每个模块下所有节点在一段时间内的调用结果、过载情况上报到reporter Service端,便于观察情况、做报警;本身消费MQ数据,UDP Server会按需向MQ写入上报状态请求

03 lars-lbAgentV0.4-负责均衡判断参数配置

## 2) 构建Lars-Agent项目    

### 2.1 构建目录结构

依次创建如下目录:

> Lars/lars_loadbalance_agent



```bash
lars_loadbalance_agent/
├── bin/
├── conf/
│   └── lars_lb_agent.conf
├── include/
├── Makefile
└── src/
```



其中Makefile如下:

```makefile
TARGET= bin/lars_lb_agent
CXX=g++
CFLAGS=-g -O2 -Wall -Wno-deprecated

BASE=../base
BASE_H=$(BASE)/include

PROTO = $(BASE)/proto
PROTO_H = $(BASE)/proto

LARS_REACTOR=../lars_reactor
LARS_REACTOR_H =$(LARS_REACTOR)/include
LARS_REACTOR_LIB=$(LARS_REACTOR)/lib  -llreactor

MYSQL=$(BASE)/mysql-connector-c
MYSQL_H=$(MYSQL)/include
MYSQL_LIB=$(MYSQL)/lib/libmysqlclient.a

OTHER_LIB = -lpthread -ldl -lprotobuf
SRC= ./src
INC= -I./include -I$(BASE_H) -I$(LARS_REACTOR_H) -I$(MYSQL_H) -I$(PROTO_H)

LIB= $(MYSQL_LIB) -L$(LARS_REACTOR_LIB) $(OTHER_LIB) 


OBJS = $(addsuffix .o, $(basename $(wildcard $(SRC)/*.cpp)))
OBJS += $(PROTO)/lars.pb.o

$(TARGET): $(OBJS)
        mkdir -p bin
        $(CXX) $(CFLAGS) -o $(TARGET) $(OBJS) $(INC) $(LIB)

%.o: %.cpp
        $(CXX) $(CFLAGS) -c -o $@ $< $(INC) 

.PHONY: clean

clean:
        -rm -f src/*.o  $(PROTO)/lars.pb.o $(TARGET)
```

​        实际上reporter、dns相似。

> conf/lars_lb_agent.conf

```ini
[reporter]
ip = 127.0.0.1
port = 7779

[dnsserver]
ip = 127.0.0.1
port = 7778
```

​        目前的基本配置文件,因为loadbalance_agent是充当reporter和dnsserver的客户端,所以需要知道对应的reporter和dnsserver的ip和port信息。

04 lars-lbAgentV0.4-负载均衡idle节点的失败率判断

### 2.2 主模块业务搭建

![19-lars-agent_1](./pictures/19-lars-agent_1.png)

​        首先我们要在主线程中,启动3个UDP Server线程,这个是提供业务层/API层的服务。然后分别启动report_client线程,用来和reporter Service进行通信,将请求上报信息发送给Reporter Service。 然后再启动dns_client线程,用来和dns service通信。

> lars_loadbalance_agent/include/main_server.h 

```c
#pragma once
#include "lars_reactor.h"
#include "lars.pb.h"


//与report_client通信的thread_queue消息队列
extern thread_queue<lars::ReportStatusRequest>* report_queue;
//与dns_client通信的thread_queue消息队列
extern thread_queue<lars::GetRouteRequest>* dns_queue;


// 启动udp server服务,用来接收业务层(调用者/使用者)的消息
void start_UDP_servers(void);

// 启动lars_reporter client 线程
void start_report_client(void);

// 启动lars_dns client 线程
void start_dns_client(void);
```

05 lars-lbAgentV0.4-负载均衡overload节点的成功率判断

> lars_loadbalance_agent/src/main_server.cpp 

```c
#include "main_server.h"
#include "lars.pb.h"

//与report_client通信的thread_queue消息队列
thread_queue<lars::ReportStatusRequest>* report_queue = NULL;
//与dns_client通信的thread_queue消息队列
thread_queue<lars::GetRouteRequest>* dns_queue = NULL;

int main(int argc, char **argv)
{
    //1 加载配置文件
    
    //2 启动udp server服务,用来接收业务层(调用者/使用者)的消息
    start_UDP_servers();
    
    //3 启动lars_reporter client 线程
    report_queue = new thread_queue<lars::ReportStatusRequest>();
    if (report_queue == NULL) {
        fprintf(stderr, "create report queue error!\n");
        exit(1);
    }
    start_report_client();
    
    //4 启动lars_dns client 线程
    dns_queue = new thread_queue<lars::GetRouteRequest>();
    if (dns_queue == NULL) {
        fprintf(stderr, "create dns queue error!\n");
        exit(1);
    }
    start_dns_client();
    

    std::cout <<"done!" <<std::endl;
    while (1) {
        sleep(10);
    }

    return 0;
}
```

06 lars-lbAgentV0.4-负载均衡上报提交模块

这里我们分别在main()中 ,开启以上线程。

​        其中`report_client`线程需要携带`thread_queue<lars::ReportStatusRequest>`消息队列通道。`agent`负责将上报请求消息`lars::ReportStatusRequest`通过thread_queue发送给reporter service。

​        其中`dns_client`线程需要携带`thread_queue<lars::GetRouteRequest>`。`agent`负责将请求modid/cmdid的route消息`lars::GetRouteRequest`通过thread_queue发送给dns service。



3个udp server的线程开辟实现如下:

> lars_loadbalance_agent/src/agent_udp_server.cpp

```c
#include "lars_reactor.h"
#include "main_server.h"


void * agent_server_main(void * args)
{
    int *index = (int*)args;
    short port = *index + 8888;
    event_loop loop;

    udp_server server(&loop, "0.0.0.0", port);

    //TODO 给server注册消息分发路由业务

    printf("agent UDP server :port %d is started...\n", port);
    loop.event_process();

    return NULL;
}

07 lars-lbAgentV0.4-数据问题修改-上报业务测试

void start_UDP_servers(void)
{
    for (int i = 0; i < 3; i ++) {
        pthread_t tid;
        
        int ret = pthread_create(&tid, NULL, agent_server_main, &i);
        if (ret == -1) {
            perror("pthread_create");
            exit(1);
        }

        pthread_detach(tid);

    }
}
```



reporter thread创建实现如下:

> lars_loadbalance_agent/src/reporter_client.cpp

```c
#include "lars_reactor.h"
#include "main_server.h"
#include <pthread.h>

void *report_client_thread(void* args)
{
    printf("report client thread start\n");
#if 0
    event_loop loop;

    //1 加载配置文件得到repoter ip + port
    std::string ip = config_file::instance()->GetString("reporter", "ip", "");
    short port = config_file::instance()->GetNumber("reporter", "port", 0);

    //2 创建客户端
    tcp_client client(&loop, ip.c_str(), port, "reporter client");

    //3 将 thread_queue消息回调事件,绑定到loop中
    report_queue->set_loop(&loop);
    report_queue->set_callback()

    //4 启动事件监听
    loop.event_process();
#endif

    return NULL;
}

08 lars-lbAgentV0.4-模拟器测试工具

void start_report_client()
{
    //开辟一个线程
    pthread_t tid;

    //启动线程业务函数
    int ret = pthread_create(&tid, NULL, report_client_thread, NULL);
    if (ret == -1) {
        perror("pthread_create");
        exit(1);
    }

    //设置分离模式
    pthread_detach(tid);
}
```



dns thread创建实现如下:

> lars_loadbalance_agent/src/dns_client.cpp

```c
#include "lars_reactor.h"
#include "main_server.h"
#include <pthread.h>

void *dns_client_thread(void* args)
{
    printf("dns client thread start\n");

    return NULL;
}

void start_dns_client()
{
    //开辟一个线程
    pthread_t tid;

    //启动线程业务函数
    int ret = pthread_create(&tid, NULL, dns_client_thread, NULL);
    if (ret == -1) {
        perror("pthread_create");
        exit(1);
    }

    //设置分离模式
    pthread_detach(tid);
}
```

09 lars-lbAgentV0.5-idle连续成功-overload连续失败的定期窗

口重置机制

### 2.3 测试lb_agentV0.1开发

编译,然后我们简单启动一下`./bin/lars_lb_agent`

```bash
$ ./bin/lars_lb_agent 
dns client thread start
report client thread start
done!
msg_router init...
server on 0.0.0.0:8888 is running...
agent UDP server :port 8888 is started...
msg_router init...
server on 0.0.0.0:8888 is running...
agent UDP server :port 8888 is started...
msg_router init...
server on 0.0.0.0:8888 is running...
agent UDP server :port 8888 is started...
...
```
 

10 lars-lbAgentV0.6-loadbalance主动更新主机信息功能

## 3) Report Client设计与实现

​        report client主要是实现thread_queue的回调业务,udp server会定期的上传上报数据到reporter,那么请求对于report client就是透传给reporter serivce即可。

> lars_loadbalance_agent/src/reporter_client.cpp

```c
#include "lars_reactor.h"
#include "main_server.h"
#include <string>
#include <pthread.h>

//typedef void io_callback(event_loop *loop, int fd, void *args);
//只要thread_queue有数据,loop就会触发此回调函数来处理业务
void new_report_request(event_loop *loop, int fd, void *args)
{
    tcp_client *client = (tcp_client*)args;

    //1. 将请求数据从thread_queue中取出,
    std::queue<lars::ReportStatusRequest>  msgs;

    //2. 将数据放在queue队列中
    report_queue->recv(msgs);
    
    //3. 遍历队列,通过client依次将每个msg发送给reporter service
    while (!msgs.empty()) {
        lars::ReportStatusRequest req = msgs.front();
        msgs.pop();

        std::string requestString;
        req.SerializeToString(&requestString);

        //client 发送数据
        client->send_message(requestString.c_str(), requestString.size(), lars::ID_ReportStatusRequest);
    }
}

11 昨日回顾

void *report_client_thread(void* args)
{
    printf("report client thread start\n");
    
    event_loop loop;

    //1 加载配置文件得到repoter ip + port
    std::string ip = config_file::instance()->GetString("reporter", "ip", "");
    short port = config_file::instance()->GetNumber("reporter", "port", 0);

    //2 创建客户端
    tcp_client client(&loop, ip.c_str(), port, "reporter client");

    //3 将 thread_queue消息回调事件,绑定到loop中
    report_queue->set_loop(&loop);
    report_queue->set_callback(new_report_request, &client);

    //4 启动事件监听
    loop.event_process();

    return NULL;
}

12 Lars-LbAgentV0.7-GetRouteAPI实现

void start_report_client()
{
    //开辟一个线程
    pthread_t tid;

    //启动线程业务函数
    int ret = pthread_create(&tid, NULL, report_client_thread, NULL);
    if (ret == -1) {
        perror("pthread_create");
        exit(1);
    }

    //设置分离模式
    pthread_detach(tid);
}
```



## 4) Dns Client设计与实现

​        dns client 和report client的业务十分相似,只是针对的协议不同了。dns client的thread_queue 回调业务主要是透传`lars::GetRouteRequest`数据包。

> lars_loadbalance_agent/src/dns_client.cpp

```c
#include "lars_reactor.h"
#include "main_server.h"
#include <pthread.h>


//typedef void io_callback(event_loop *loop, int fd, void *args);
//只要thread_queue有数据,loop就会触发此回调函数来处理业务
void new_dns_request(event_loop *loop, int fd, void *args)
{
    tcp_client *client = (tcp_client*)args;

    //1. 将请求数据从thread_queue中取出,
    std::queue<lars::GetRouteRequest>  msgs;

    //2. 将数据放在queue队列中
    dns_queue->recv(msgs);
    
    //3. 遍历队列,通过client依次将每个msg发送给reporter service
    while (!msgs.empty()) {
        lars::GetRouteRequest req = msgs.front();
        msgs.pop();

        std::string requestString;
        req.SerializeToString(&requestString);

        //client 发送数据
        client->send_message(requestString.c_str(), requestString.size(), lars::ID_GetRouteRequest);
    }

}

13 Lars-LbAgentV0.7-Udp-server-获取路由服务业务注册

void *dns_client_thread(void* args)
{
    printf("dns client thread start\n");
    event_loop loop;

    //1 加载配置文件得到dns service ip + port
    std::string ip = config_file::instance()->GetString("dnsserver", "ip", "");
    short port = config_file::instance()->GetNumber("dnsserver", "port", 0);

    //2 创建客户端
    tcp_client client(&loop, ip.c_str(), port, "dns client");

    //3 将thread_queue消息回调事件,绑定到loop中
    dns_queue->set_loop(&loop);
    dns_queue->set_callback(new_dns_request, &client);

    //4 启动事件监听
    loop.event_process(); 

    return NULL;
}


void start_dns_client()
{
    //开辟一个线程
    pthread_t tid;

    //启动线程业务函数
    int ret = pthread_create(&tid, NULL, dns_client_thread, NULL);
    if (ret == -1) {
        perror("pthread_create");
        exit(1);
    }

    //设置分离模式
    pthread_detach(tid);
}
```

14 Lars-LbAgentV0.7-Udp-server-API和udpserver的测试

## 5) 负载均衡模块基础设计(V0.2)



### 5.1 基础

​        每个模块`modid/cmdid`下有若干节点,节点的集合称为此模块的路由; 对于每个节点,有两种状态:

- `idle`:此节点可用,可作为API**(相当于Agent的客户端)**请求的节点使用;

- `overload`:此节点过载,暂时不可作为API请求的节点使用

  ​    在请求节点时,有几个关键属性:

- 虚拟成功次数`vsucc`,API汇报节点调用结果是成功时,该值+1
- 虚拟失败次数`verr`,API汇报节点调用结果是失败时,该值+1
- 连续成功次数`contin_succ`,连续请求成功的次数
- 连续失败次数`contin_err`,连续请求失败的次数

这4个字段,在节点状态改变时(idle<—>overload),会被重置。
 

相关文章:

C++负载均衡远程调用学习之负载均衡算法与实现

目录 01 lars 系统架构回顾 02 lars-lbAgentV0.4-route_lb处理report业务流程 03 lars-lbAgentV0.4-负责均衡判断参数配置 04 lars-lbAgentV0.4-负载均衡idle节点的失败率判断 05 lars-lbAgentV0.4-负载均衡overload节点的成功率判断 06 lars-lbAgentV0.4-负载均衡上报提交…...

AIGC学术时代:DeepSeek如何助力实验与数值模拟

目录 1.实验和数值模拟工具 2.结合使用 大家好这里是AIWritePaper官方账号&#xff0c;官网&#x1f449;AIWritePaper~ 在工程和科学研究的世界里&#xff0c;实验与数值模拟是探索未知、验证理论和推动创新的两大支柱。它们如同一对翅膀&#xff0c;让思想得以飞翔&#xf…...

PHP数组排序深度解析:sort()、rsort()、asort()、arsort()、ksort()、krsort() 的适用场景与性能对比

在PHP开发中&#xff0c;数组排序是日常操作的核心技能之一。无论是处理用户数据、产品列表&#xff0c;还是分析日志信息&#xff0c;合理的排序方法能显著提升代码的效率和可维护性。PHP提供了多种数组排序函数&#xff08;如 sort()、rsort()、asort() 等&#xff09;&#…...

2025年企业Radius认证服务器市场深度调研:中小企业身份安全投入产出比最优解

引言&#xff1a;数字化转型浪潮下的身份安全新命题 在混合办公成为常态、物联网设备呈指数级增长、网络攻击手段日益隐蔽的2025年&#xff0c;企业网络边界正在经历前所未有的重构。据IDC预测&#xff0c;全球企业网络安全投入中&#xff0c;身份与访问管理&#xff08;IAM&a…...

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验-批量推理(三)

一、前言 阿里云最新推出的 Qwen3-8B 大语言模型,作为国内首个集成“快思考”与“慢思考”能力的混合推理模型,凭借其 80 亿参数规模及 128K 超长上下文支持,正在重塑 AI 应用边界。该模型既可通过轻量化“快思考”实现低算力秒级响应,也能在复杂任务中激活深度推理模式,以…...

相同IP和端口的服务器ssh连接时出现异常

起因 把服务器上的一个虚拟机搞坏了&#xff0c;所以删除重新创建了一个&#xff0c;端口号和IP与之前的虚拟机相同。 ssh usernameIP -p port 时报错 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone…...

VScode中关于Copilot的骚操作

目录 1. Ctrl I 直接在工作区对话 2.Tab 党福音&#xff1a;写注释生成代码 3. 连续写几行函数头&#xff0c;Copilot 会自动“补全全函数” 4. 自动写单元测试 5. 在注释中要求它写某种风格 6. 代码重写器 7. 多语言切换无痛自动翻译 8. 在空文件中写注释&#xff0c…...

linux inotify 资源详解

Linux 的 inotify 是一个强大的文件系统监控机制&#xff0c;允许应用程序实时监听文件和目录的变化。这对于需要响应文件系统事件的应用&#xff08;如配置热加载、备份工具、文件同步服务等&#xff09;至关重要。以下是对 inotify 资源的深度解析&#xff1a; 一、核心概念…...

Java SE(8)——继承

1.继承的概念&作用 在Java中&#xff0c;继承是面向对象编程的三大基本特性之一&#xff08;还有封装和多态&#xff09;&#xff0c;允许一个类&#xff08;子类/继承类&#xff09;继承另一个类&#xff08;父类/基类&#xff09;的属性和方法 继承的核心目的是&#xf…...

【论文笔记】SOTR: Segmenting Objects with Transformers

【题目】&#xff1a;SOTR: Segmenting Objects with Transformers 【引用格式】&#xff1a;Guo R, Niu D, Qu L, et al. Sotr: Segmenting objects with transformers[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 7157-7166. 【网…...

AIDC智算中心建设:资源池化核心技术解析

目录 一、池化技术架构 二、池化核心技术 三、展望 一、池化技术架构 智能算力池化指依托云计算技术&#xff0c;整合 GPU/AI 芯片等异构算力资源&#xff0c;构建集中管理的资源池&#xff0c;并按上层智算业务的需求&#xff0c;对池化的资源进行统一调度、分配&#xff…...

flink监控指标

文章目录 一、flink yaml配置二、配置指标项情况 提示&#xff1a;以下是基于开源flink on k8s环境下配置监控指标(部分已实验&#xff0c;粗略记录) 一、flink yaml配置 配置完成后就可以在页面查询(部分 需要验证)指标 二、配置指标项情况 参考下面网址&#xff1a; 阿里…...

签名去背景图像处理实例

一、前言 在生活中我们经常用到电子签名&#xff0c;但有时候我们所获取的图像的彩色图像&#xff0c;我们需要获取白底黑字的电子签名&#xff0c;我们可以通过下面程序对彩色图像进行处理达到我们的处理目的。 原始彩色图像如下&#xff1a; 二、原始代码 clear all;close a…...

[人机交互]理解与概念化交互

零.本章重点&#xff08;理解和分析用户问题&#xff09; – 解释“问题空间”的概念和含义 – 解释如何概念化交互 – 描述什么是概念模型 – 讨论将界面隐喻作为概念模型的利弊 – 讨论界面具体化和抽象化各自的优缺点 – 概述概念设计和实际设计的关系 一.理解问题空间 简单…...

C与指针——常见库函数

字符串 #include<stdlibs.h> int abs(int); long labs(long); int rand(void);//0-RAND_MAX //字符串转值 int atoi(const char*); long atol(const char*); float atof(const char*);数学\排序 #include<math.h> \\常见三角&#xff0c;sqrt(); exp(); double p…...

【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

. &#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 文章目录 一、初识list容器1.1 什么是list&#xff1f;1.2 核心特性1.3 典型应用场景 二、核心成员函数…...

Auto.js 脚本:清理手机数据但保留账号

Auto.js 脚本&#xff1a;清理手机数据但保留账号 以下是一个使用 Auto.js 实现的脚本&#xff0c;它可以帮你清理手机数据&#xff08;类似恢复出厂设置&#xff09;&#xff0c;同时尽可能保留已登录的账号状态。请注意&#xff0c;这个脚本不能完全等同于真正的恢复出厂设置…...

Web Workers 技术详解与最佳实践

Web Workers 是 HTML5 提供的一个强大的多线程解决方案&#xff0c;它允许在后台线程中运行 JavaScript 代码&#xff0c;从而避免阻塞主线程。本文将深入探讨 Web Workers 的技术实现和实际应用。 一、Web Workers 基础 1. 创建 Worker // 主线程代码 const worker new Wo…...

llama_factory0.9.3微调Qwen3

llama_factory微调QWen1.5-CSDN博客文章浏览阅读3.3k次,点赞36次,收藏10次。本文介绍了如何使用LLaMA-Factory微调Qwen1.5模型,包括1.8B和0.5B版本的训练细节。在数据、训练、LORA融合及...

Linux的时间同步服务器(附加详细实验案例)

一、计时方式的发展 1.古代计时方式​ 公元前约 2000 年&#xff1a;古埃及人利用光线留下的影子计时&#xff0c;他们修建高耸的大型方尖碑&#xff0c;通过追踪方尖碑影子的移动判断时间&#xff0c;这是早期利用自然现象计时的典型方式 。​商朝时期&#xff1a;人们开发并…...

【全队项目】智能学术海报生成系统PosterGenius--前后端系统介绍

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;大模型实战训练营_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 一. 前…...

COlT_CMDB_linux_tomcat_20250505.sh

#!/bin/bash #IT_BEGIN #IT_TYPE3 #IT MIDWARE_TOMCAT_DISCOVERY|discovery.tomcat[disc] #原型指标 #IT_RULE MIDWARE_TOMCAT_IP|ip[{#CATALINA_BASE}] #IT_RULE MIDWARE_TOMCAT_Startpid|Start_pid[{#CATALINA_BASE}] #IT_RULE MIDWARE_TOMCAT_hostname|hostname[{#CATALINA_…...

【瞎折腾/mi50 32G/ubuntu】mi50显卡ubuntu运行大模型开坑(二)使用llama.cpp部署Qwen3系列

目录 说在前面准备工作编译llama.cpp运行Qwen3系列4B Q432B Q6温度 参考 说在前面 主板&#xff1a;未知x99cpu&#xff1a;E5 2666v3显卡&#xff1a;Mi 50 32G系统&#xff1a;ubuntu 22.04 准备工作 挂载磁盘(可选) 由于我的系统装在U盘上&#xff0c;访问文件系统会比较慢…...

《数据结构初阶》【顺序栈 + 链式队列 + 循环队列】

《数据结构初阶》【顺序栈 链式队列 循环队列】 前言&#xff1a;什么是栈&#xff1f;栈有哪些实现方式&#xff1f;我们要选择哪种实现方式&#xff1f;--------------------------------什么是队列&#xff1f;队列有哪些实现方式&#xff1f;我们要选择哪种实现方式&…...

TCP和UDP

一、基本概念 1. TCP&#xff08;传输控制协议&#xff0c; Transmission Control Protocol&#xff09; 面向连接&#xff08;Connection-oriented&#xff09;&#xff1a;在传输数据前&#xff0c;要建立连接&#xff08;三次握手&#xff09;可靠&#xff1a;保证数据按顺…...

AI小智本地前后端部署

AI小智本地部署 1.安装phpstudy 1.1.安装该软件是为了获得web环境&#xff1a;MySQLApacherediophpmyadmin&#xff0c;介绍如下&#xff1a; ✅ 1. MySQL&#xff08;数据库&#xff09; 作用&#xff1a;关系型数据库管理系统&#xff0c;存储结构化数据&#xff0c;如用…...

springboot+mysql+element-plus+vue完整实现汽车租赁系统

目录 一、项目介绍 二、项目截图 1.项目结构图 三、系统详细介绍 管理后台 1.登陆页 2.管理后台主页 3.汽车地点管理 4.汽车类别 5.汽车品牌 6.汽车信息 7.用户管理 8.举报管理 9.订单管理 10.轮播图管理 11.交互界面 12.图表管理 汽车租赁商城 1.首页 2.汽…...

直方图比较

目录 1、直方图比较的概念 2、直方图比较的主要原因 3、典型应用场景 4、基础直方图比较 5、多通道直方图比较 6、实时直方图检测 1、直方图比较的概念 直方图比较是通过数学方法计算两个直方图之间的相似度或差异度的技术。在计算机视觉中&#xff0c;直方图是对图像特征…...

【计算机视觉】3d人体重建:PIFu/PIFuHD:高精度三维人体数字化技术指南

深度解析PIFu/PIFuHD&#xff1a;高精度三维人体数字化技术指南 一、项目概述与技术突破1.1 技术定位与核心价值1.2 性能指标对比1.3 技术演进路线 二、环境配置与模型部署2.1 硬件要求2.2 软件安装基础环境配置附加组件安装 2.3 模型下载 三、核心算法解析3.1 网络架构设计多层…...

HTML05:超链接标签及应用

链接标签 <a href"path" target"目标窗口位置">链接文本或图像</a>文本超链接图像超链接 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>链接标签学习</title&…...

JAVA设计模式——(十一)建造者模式(Builder Pattern)

JAVA设计模式——&#xff08;十一&#xff09;建造者模式&#xff08;Builder Pattern&#xff09; 介绍理解实现Phone类具体手机类建造者测试 应用 介绍 建造者模式用于将对象的创建和表示进行分离&#xff0c;即对象创建的过程单独提取出来&#xff0c;作为建造者的职能&am…...

JavaScript 笔记 --- part7 --- JS进阶 (part2)

JS进阶(part2) 内置构造函数 Object: 用于创建对象 String: 用于创建字符串 Number: 用于创建数字 Array: 用于创建数组 Boolean: 用于创建布尔值 Function: 用于创建函数 Date: 用于创建日期对象 RegExp: 用于创建正则表达式对象 Error: 用于创建错误对象 Map: 用于…...

JavaScript 笔记 --- part8 --- JS进阶 (part3)

JS 进阶(part3) 深浅拷贝 只针对引用类型 浅拷贝 浅拷贝只拷贝外面一层的属性, 如果对象里面还有对象, 那么这个对象的引用会被拷贝过去, 所以修改其中一个属性会影响到另一个对象 const obj {name: "zhangsan",age: 18,child: {name: "xiaoming",ag…...

LeetCode 热题 100 46. 全排列

LeetCode 热题 100 | 46. 全排列 大家好&#xff0c;今天我们来解决一道经典的算法题——全排列。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求给定一个不含重复数字的数组 nums&#xff0c;返回其所有可能的全排列。全排列是排列组合中的经典问题&#xff0c;通常可…...

双目视觉的核心目标

通过计算左右图像中同一物体的像素点位置差&#xff08;视差&#xff09;&#xff0c;进而还原出物体在三维空间中的真实位置。 双目视觉的核心流程&#xff1a; 1️⃣ 相机标定&#xff08;calibration&#xff09; 获取左右相机的内参、外参和畸变参数。 获取投影矩阵 Q&a…...

《类和对象(上)》

引言&#xff1a; 上次我们学习了C的一些入门基础&#xff0c;但其实还没有入门C&#xff0c;想要入门C&#xff0c;肯定是要把类和对象这部分学透彻&#xff0c;这次先来学习类和对象&#xff08;上&#xff09; 一&#xff1a;类的定义 1. 类定义格式&#xff1a; class为…...

强化学习ppo算法在大语言模型上跑通

最近在研究强化学习&#xff0c;目标是想在我的机械臂上跑出效果。ppo算法是强化学习领域的经典算法&#xff0c;在网上检索ppo算法&#xff0c;出现的大部分文章都是互相抄袭&#xff0c;上来都列公式&#xff0c;让人看得云里雾里。偶然间发现一个deepspeed使用的example(链接…...

告别散乱的 @ExceptionHandler:实现统一、可维护的 Spring Boot 错误处理

Spring Boot 的异常处理机制一直都烂得可以。即便到了 2025 年&#xff0c;有了这么多进步和新版本&#xff0c;开发者们发现自己还是在跟 ControllerAdvice、分散各处的 ExceptionHandler 方法以及五花八门的响应结构较劲。这真的是一团糟。 无论你是在构建 REST API、微服务…...

Ubuntu安装编译环境

1. 安装基础编译工具链&#xff08;GCC, G, Make 等&#xff09; sudo apt update # 只更新索引信息​&#xff0c;不安装软件 sudo apt install build-essential这会安装以下核心组件&#xff1a; • gcc (GNU C 编译器) • g (GNU C 编译器) • make (构建工具) • libc-…...

Scrapy爬虫实战:如何用Rules实现高效数据采集

Scrapy是一个强大的Python爬虫框架&#xff0c;而其中的Rules类则为爬虫提供了更高级的控制方式。本文将详细介绍如何在Scrapy中使用Rules&#xff0c;以及各个参数的具体作用&#xff0c;并结合实际场景说明Rules的必要性。 为什么需要Rules&#xff1f; 在Web爬取过程中&…...

ERP系统源码,有演示,开发文档、数据库文档齐全,支持二次开发

一套开箱即用的云端ERP系统源代码&#xff0c;小型工厂ERP系统源码 SaaS ERP是一套开箱即用的云端ERP系统&#xff0c;有演示&#xff0c;开发文档&#xff0c;数据库文档齐全&#xff0c;自主版权落地实例&#xff0c;适合项目二开。 SaaS ERP具有高度的灵活性和可扩展性&am…...

如何将腾讯云的测试集成到自己的SpringBoot中

1.创建Util 我们将之前测试的test复制过来&#xff0c; 1.将方法里面的固定参数设置出来private 2.将方法里面的变化参数设置作为传入参数 3.返回String类型的URL地址 完整代码如下&#xff1a; package org.huangyingyuan.utils;import com.qcloud.cos.COSClient; import…...

Java后端开发day41--IO流(一)--FileOutputStreamFileInputStream

(以下内容全部来自上述课程) IO流&#xff1a;存储和读取数据的解决方案 I&#xff1a;input O&#xff1a;output 流&#xff1a;像水流一样传输数据 1. 流的分类 纯文本文件&#xff1a;Windows自带的记事本打开就能读懂 2. IO流的体系 3 字节流 3.1 FileOutputStream 操…...

Spring 框架中 @Configuration 注解详解

在 Spring 框架的开发过程中&#xff0c;Configuration注解是一个极为重要的存在&#xff0c;它让开发者能够以一种更加简洁、灵活的方式来管理应用程序的配置信息&#xff0c;极大地提升了开发效率和代码的可维护性。 本文将深入剖析Configuration注解的方方面面&#xff0c;…...

手机打电话时由对方DTMF响应切换多级IVR语音应答(一)

手机打电话时由对方DTMF响应切换多级IVR语音应答&#xff08;一&#xff09; --本地AI电话机器人 一、前言 经前面的系列篇章中&#xff0c;我们实现了拦截手机打电话的声音、根据通话对方声音提取DTMF字符。由此&#xff0c;我们通往AI电话机器人的道路就畅通无阻了。 如果…...

GM DC Monitor v2.0 - 平台自定义-使用说明

平台支持对LOGO、登录页背景图、平台名称、小标题名称、网址、告警中心、知识库名称进行自定义&#xff0c;自定义完以后&#xff0c;平台将更加适合您的工作场景&#xff01; LOGO自定义建议使用100*80的png背景透明图片&#xff0c;大小不超过200k 登录背景建议使用1920*71…...

实验-数字电路设计2-复用器和七段数码管(数字逻辑)

目录 一、实验内容 二、实验步骤 2.1 复用器的设计 2.2 七段数码管的设计 三、调试过程 3.1 复用器调试过程 3.2 七段数码管的调试过程 四、实验使用环境 五、实验小结和思考 一、实验内容 a) 介绍 在这次实验中&#xff0c;你将熟悉 Logisim 的操作流程&#xff…...

HTTP/HTTPS协议(请求响应模型、状态码)

目录 HTTP/HTTPS协议简介 HTTP协议 HTTPS协议 请求 - 响应模型 HTTP请求 &#xff08;二&#xff09;HTTP响应 HTTPS协议与HTTP协议在请求 - 响应模型中的区别 HTTP/HTTPS协议简介 HTTP协议 定义 HTTP&#xff08;HyperText Transfer Protocol&#xff09;即超文本传输…...

详解RabbitMQ工作模式之路由模式

目录 路由模式 概念介绍 工作原理 特点 应用场景 实现步骤 代码案例 引入依赖 常量类 编写生产者代码 编写消费者1代码 编写消费者2代码 运行代码 路由模式 概念介绍 路由模式是发布订阅模式的变种, 在发布订阅基础上, 增加路由key。 发布订阅模式是⽆条件的将所有…...

青少年编程与数学 02-018 C++数据结构与算法 26课题、数据压缩算法

青少年编程与数学 02-018 C数据结构与算法 26课题、数据压缩算法 一、无损压缩算法1. Huffman编码2. Lempel-Ziv-Welch (LZW) 编码3. Run-Length Encoding (RLE) 二、有损压缩算法1. DEFLATE&#xff08;ZIP压缩&#xff09;2. Brotli3. LZMA4. Zstandard (Zstd) 总结 课题摘要…...