如何理解响应式编程
思考:
分析Netty与Reactor背压协调策略
用户的问题是关于如何在 Netty 和 Project Reactor 联合使用时处理背压问题,特别是当 Reactor 的处理速度跟不上 Netty 的事件产生速度时该怎么办。这是一个技术性很强的问题,涉及到 Netty 的非阻塞特性、Reactor 的背压机制以及两者之间的协调。我需要先明确用户的需求和潜在意图。
首先,用户提到 Netty 和 Reactor 的联合使用,这表明他们可能在构建一个高性能的异步系统,比如一个高并发的服务器。Netty 负责处理网络事件,而 Reactor 用于处理数据流和背压。用户的核心问题是如何在 Reactor 处理速度较慢时避免被 Netty 的高速事件淹没,这说明他们关注的是系统的稳定性和资源保护。
接下来,我需要思考如何结合 Netty 和 Reactor 的特性来解决这个问题。Netty 的非阻塞特性意味着它会尽可能快地处理网络事件,而 Reactor 提供了背压机制,可以通过订阅者控制数据流的速度。两者的结合点在于如何将 Netty 的事件流转化为 Reactor 可以管理的数据流,并利用 Reactor 的背压机制来调节 Netty 的处理速度。
我首先想到的是 Reactor 的 Flux
和 Mono
,它们是数据流的核心组件,支持背压控制。通过将 Netty 的事件包装成 Reactor 的数据流,可以利用 Reactor 的请求机制来限制 Netty 的事件传递速度。比如,订阅者可以通过 request(n)
方法明确告诉发布者它能处理多少数据,从而避免被过多的事件压垮。
然后,我考虑到 Reactor 的 BaseSubscriber
,它允许更细粒度的背压控制。通过重写 hookOnSubscribe
和 hookOnNext
方法,可以在订阅时设置初始请求量,并在处理每个事件时动态调整请求量。这种方式适合处理速度波动较大的场景。
此外,我还需要考虑 Reactor 的线程模型。如果 Reactor 的处理速度跟不上,可能是因为线程资源不足。这时可以调整 Reactor 的调度器,比如使用 Schedulers.parallel()
或自定义线程池来提高并发处理能力。
最后,我想到 Netty 本身也可以通过限制读取速率来实现背压。例如,在 ChannelHandler
中控制读取操作的频率,或者在 Reactor 请求数据时才继续读取。这种方式直接作用于 Netty 的事件循环,可以有效减缓事件的产生速度。
在回答时,我需要将这些思路组织成清晰的步骤,既要涵盖 Reactor 的背压机制,也要结合 Netty 的特性,同时提供一些具体的实现建议,比如如何调整线程池或优化数据流处理逻辑。回答的语气需要专业但易于理解,避免过于学术化,同时确保技术细节准确。
结果:
在Netty中以非阻塞方式与Project Reactor联合使用时,可以通过以下方式实现背压,并处理Project Reactor内部处理速度较慢的情况:
### 1. 使用Reactor的背压机制
- **Flux和Mono的请求控制**:在Reactor中,Flux和Mono是数据流的发布者,它们的订阅者可以通过请求机制来控制数据的流动。例如,订阅者可以使用`request(n)`方法来请求最多处理`n`个元素,从而避免被过多的数据淹没。
- **自定义订阅者**:通过继承`BaseSubscriber`类并重写`hookOnSubscribe`和`hookOnNext`等方法,可以更精细地控制背压策略。在`hookOnSubscribe`中,可以通过`request`方法指定初始请求的数据量,然后在`hookOnNext`中根据处理情况继续请求或取消请求。
### 2. 处理Project Reactor内部处理速度较慢的情况
- **调整线程池配置**:如果Project Reactor的内部处理速度跟不上Netty的事件处理速度,可以考虑调整线程池的配置,增加线程数量以提高处理能力。例如,使用`Schedulers.parallel()`来创建一个并行的调度器,或者自定义一个具有足够线程的线程池。
- **使用缓冲区和信号策略**:在Reactor中,可以通过`Flux.create`方法的`OverflowStrategy`参数来指定当处理速度较慢时的策略。例如,使用`BUFFER`策略来缓冲数据,或者使用`DROP`策略在下游无法跟上时丢弃数据。
- **优化数据流处理逻辑**:对数据流的处理逻辑进行优化,减少不必要的操作和延迟,提高处理效率。例如,避免在数据流处理过程中进行阻塞操作,使用异步非阻塞的方式进行数据处理。
### 3. 在Netty中实现数据流控制
- **限制数据读取速率**:在Netty的ChannelHandler中,可以通过控制读取操作的频率来实现背压。例如,在读取数据后,根据处理情况决定是否继续读取,或者使用定时器来限制读取的间隔。
- **使用Reactor的背压信号**:将Netty的事件与Reactor的数据流结合起来,通过Reactor的背压信号来控制Netty的数据读取。例如,当Reactor的订阅者请求数据时,Netty才继续读取并发送数据。
### 示例代码
以下是一个简单的示例,展示了如何在Netty中使用Project Reactor并实现背压:
```java
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import reactor.core.publisher.Flux;
import reactor.core.scheduler.Schedulers;
public class NettyReactorBackpressureExample {
public static void main(String[] args) throws InterruptedException {
// Netty服务器配置
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new NettyReactorHandler());
}
});
ChannelFuture f = b.bind(8080).sync();
f.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
static class NettyReactorHandler extends ChannelInboundHandlerAdapter {
private Flux<String> reactorFlux;
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 将Netty的事件转换为Reactor的Flux
reactorFlux = Flux.just(msg.toString())
.publishOn(Schedulers.parallel()) // 指定处理线程池
.doOnNext(data -> {
// 模拟处理速度较慢的情况
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Processed data: " + data);
})
.onBackpressureBuffer() // 使用缓冲策略处理背压
.subscribeOn(Schedulers.single()); // 指定订阅线程
// 订阅并处理数据
reactorFlux.subscribe(new BackpressureSubscriber());
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}
// 自定义订阅者,用于处理背压
static class BackpressureSubscriber extends BaseSubscriber<String> {
private int requested = 0;
@Override
protected void hookOnSubscribe(Subscription subscription) {
requested = 0;
subscription.request(1); // 初始请求1个元素
}
@Override
protected void hookOnNext(String value) {
System.out.println("Received value: " + value);
requested--;
if (requested == 0) {
request(1); // 每处理完一个元素,再请求一个
}
}
}
}
```
在这个示例中,我们通过将Netty的事件转换为Reactor的Flux,并使用Reactor的背压机制来控制数据流。通过自定义订阅者`BackpressureSubscriber`,我们实现了对数据流的精细控制,避免了处理速度较慢时的数据堆积问题。
问题:
netty中非阻塞方式 与 project reactor联合使用,netty是使用事件驱动获取远程数据,会获取一部分就给project reactor吗? 还是需要等待全部数据返回之后 在给project reactor
思考:
分析Netty和Reactor数据传递
用户的问题是关于 Netty 和 Project Reactor 的联合使用,具体是 Netty 在非阻塞方式下如何将接收到的数据传递给 Project Reactor,以及是否是分批传递还是等全部数据接收完成后再传递。这是一个技术性很强的问题,涉及到 Netty 的事件驱动机制和 Reactor 的数据流处理方式。
首先,我需要明确用户的需求。他们似乎在探讨 Netty 和 Reactor 的集成细节,尤其是数据传递的时机和方式。这可能是因为他们在实际开发中遇到了性能或背压相关的问题,或者在设计系统时需要理解两者的交互方式。用户提到“获取一部分就给 Project Reactor”或者“等待全部数据返回之后再给 Project Reactor”,这表明他们关注的是 Netty 的数据读取逻辑和 Reactor 的数据处理逻辑之间的衔接。
接下来,我需要回忆 Netty 的工作原理。Netty 是基于事件驱动的,当数据到达时,它会触发 channelRead
方法,将接收到的数据传递给管道中的处理器。这意味着 Netty 是逐步处理数据的,而不是等到所有数据接收完成才行动。这与用户的问题直接相关,因为 Netty 的设计本身决定了它是“获取一部分就处理一部分”的。
然后,我需要考虑 Reactor 的特性。Reactor 是基于响应式编程的,它通过 Flux
和 Mono
等数据流结构来处理异步事件。Reactor 的背压机制允许下游控制数据流动的速度,这意味着即使 Netty 逐步传递数据,Reactor 也可以根据处理能力决定是否接收更多数据。
结合这两点,我可以得出结论:Netty 会逐步将接收到的数据传递给 Reactor,而 Reactor 会根据背压机制决定如何处理这些数据。这种逐步传递的方式是 Netty 的默认行为,符合非阻塞 IO 的设计原则。
为了让用户更清楚地理解,我需要提供一个示例代码,展示如何在 Netty 的 channelRead
方法中将数据传递给 Reactor,并利用 Reactor 的背压机制进行处理。代码需要简洁明了,同时体现 Netty 和 Reactor 的协作方式。
最后,我需要确保回答的逻辑清晰,先解释 Netty 的逐步传递特性,再说明 Reactor 的背压处理,最后通过代码示例验证我的结论。这样可以既回答用户的问题,又提供实际的参考价值。
结论:
在Netty中以非阻塞方式与Project Reactor联合使用时,Netty会逐步获取远程数据,并在获取一部分数据后就将其传递给Project Reactor进行处理,而不会等待全部数据返回之后再传递。这种逐步传递的方式有助于实现背压控制,因为Project Reactor可以根据自身的处理能力来控制数据的流动速度。
### Netty逐步传递数据的机制
- **事件驱动架构**:Netty采用事件驱动的架构,在数据到达时触发相应的事件处理方法,如`channelRead`。这意味着每当有数据可读时,Netty会立即触发`channelRead`方法,将接收到的数据传递给后续的处理逻辑。
- **非阻塞IO**:Netty的非阻塞IO模型允许它在不阻塞线程的情况下处理多个连接的数据读取。当数据到达时,Netty会将数据读取到缓冲区,并立即触发事件,而不是等待所有数据到达后再进行处理。
### 与Project Reactor的结合
- **数据流转换**:在Netty的事件处理方法中,可以将接收到的数据转换为Project Reactor的`Flux`或`Mono`数据流。这样,Project Reactor就可以利用其背压机制来控制数据的处理速度。
- **背压控制**:Project Reactor的订阅者可以通过请求机制来控制数据的流动。例如,订阅者可以使用`request(n)`方法来请求最多处理`n`个元素,从而避免被过多的数据淹没。
### 示例代码
以下是一个简单的示例,展示了Netty如何在获取一部分数据后就将其传递给Project Reactor:
```java
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import reactor.core.publisher.Flux;
import reactor.core.scheduler.Schedulers;
public class NettyReactorIntegrationExample {
public static void main(String[] args) throws InterruptedException {
// Netty服务器配置
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new NettyReactorHandler());
}
});
ChannelFuture f = b.bind(8080).sync();
f.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
static class NettyReactorHandler extends ChannelInboundHandlerAdapter {
private Flux<String> reactorFlux;
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 将Netty的事件转换为Reactor的Flux
reactorFlux = Flux.just(msg.toString())
.publishOn(Schedulers.parallel()) // 指定处理线程池
.doOnNext(data -> {
// 模拟处理速度较慢的情况
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Processed data: " + data);
})
.onBackpressureBuffer() // 使用缓冲策略处理背压
.subscribeOn(Schedulers.single()); // 指定订阅线程
// 订阅并处理数据
reactorFlux.subscribe(new BackpressureSubscriber());
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}
// 自定义订阅者,用于处理背压
static class BackpressureSubscriber extends BaseSubscriber<String> {
private int requested = 0;
@Override
protected void hookOnSubscribe(Subscription subscription) {
requested = 0;
subscription.request(1); // 初始请求1个元素
}
@Override
protected void hookOnNext(String value) {
System.out.println("Received value: " + value);
requested--;
if (requested == 0) {
request(1); // 每处理完一个元素,再请求一个
}
}
}
}
```
在这个示例中,每当Netty接收到一部分数据时,就会触发`channelRead`方法,并将数据传递给Project Reactor的`Flux`进行处理。通过自定义订阅者`BackpressureSubscriber`,我们实现了对数据流的精细控制,避免了处理速度较慢时的数据堆积问题。
相关文章:
如何理解响应式编程
思考: 分析Netty与Reactor背压协调策略 用户的问题是关于如何在 Netty 和 Project Reactor 联合使用时处理背压问题,特别是当 Reactor 的处理速度跟不上 Netty 的事件产生速度时该怎么办。这是一个技术性很强的问题,涉及到 Netty 的非阻塞特…...
Python网络编程入门
一.Socket 简称套接字,是进程之间通信的一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间要想进行网络通信需要Socket,Socket好比数据的搬运工~ 2个进程之间通过Socket进行相互通讯&a…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例14,TableView15_14多功能组合的导出表格示例
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例14,TableView15_14多功…...
鸿蒙特效教程10-卡片展开/收起效果
鸿蒙特效教程10-卡片展开/收起效果 在移动应用开发中,卡片是一种常见且实用的UI元素,能够将信息以紧凑且易于理解的方式呈现给用户。 本教程将详细讲解如何在HarmonyOS中实现卡片的展开/收起效果,通过这个实例,你将掌握ArkUI中状…...
如何创建一个socket服务器?
1. 导入必要的库 首先,需要导入Python的socket库,它提供了创建和管理socket连接的功能。 python import socket 2. 创建服务器端socket 使用socket.socket()函数创建一个服务器端的socket对象,指定协议族(如socket.AF_INET表示…...
react自定义hook
自定义hook: 用来封装复用的逻辑,,自定义hook是以use开头的普通函数,,将组件中可复用的状态逻辑抽取到自定义的hook中,简化组件代码 常见自定义hook例子: 封装一个简单的计数器 import {useS…...
Android Compose 框架的状态与 ViewModel 的协同(collectAsState)深入剖析(二十一)
Android Compose 框架的状态与 ViewModel 的协同(collectAsState)深入剖析 一、引言 在现代 Android 应用开发中,构建响应式和动态的用户界面是至关重要的。Android Compose 作为新一代的声明式 UI 工具包,为开发者提供了一种简…...
系统与网络安全------网络应用基础(1)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 TCP/IP协议及配置 概述 TCP/IP协议族 计算机之间进行通信时必须共同遵循的一种通信规定 最广泛使用的通信协议的集合 包括大量Internet应用中的标准协议 支持跨网络架构、跨操作系统平台的数据通信 主机…...
linux常用指令(6)
今天我们继续学习一些linux常用指令,丰富我们linux基础知识,那么话不多说,来看. 1.cp指令 功能描述:拷贝文件到指定目录 基本语法:cp [选项] source dest 常用选项:-r:递归复制整个文件夹 拷贝文件: 拷贝文件夹&am…...
EasyUI数据表格中嵌入下拉框
效果 代码 $(function () {// 标记当前正在编辑的行var editorIndex -1;var data [{code: 1,name: 1,price: 1,status: 0},{code: 2,name: 2,price: 2,status: 1}]$(#dg).datagrid({data: data,onDblClickCell:function (index, field, value) {var dg $(this);if(field ! …...
【设计模式】单件模式
七、单件模式 单件(Singleton) 模式也称单例模式/单态模式,是一种创建型模式,用于创建只能产生 一个对象实例 的类。该模式比较特殊,其实现代码中没有用到设计模式中经常提起的抽象概念,而是使用了一种比较特殊的语法结构&#x…...
C++类与对象的第二个简单的实战练习-3.24笔记
哔哩哔哩C面向对象高级语言程序设计教程(118集全) 实战二 Cube.h #pragma once class Cube { private:double length;double width;double height; public:double area(void);double Volume(void);//bool judgement(double L1, double W1, double H1);…...
【视频】m3u8相关操作
1、视频文件转m3u8 1.1 常用命令 1)默认只保留 5 个ts文件 ffmpeg -i input.mp4 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls stream1.m3u82)去掉音频 -an,保留全部ts文件 ffmpeg -i input.mp4 -vf scale=640:480 -an -start_number 0 -hls_time 10 -hls_lis…...
G-Star 校园开发者计划·黑科大|开源第一课之 Git 入门
万事开源先修 Git。Git 是当下主流的分布式版本控制工具,在软件开发、文档管理等方面用处极大。它能自动记录文件改动,简化合并流程,还特别适合多人协作开发。学会 Git,就相当于掌握了一把通往开源世界的钥匙,以后参与…...
前端框架学习路径与注意事项
学习前端框架是一个系统化的过程,需要结合理论、实践和工具链的综合掌握。以下是学习路径的关键方面和注意事项: 一、学习路径的核心方面 1. 基础概念与核心思想 组件化开发:理解组件的作用(复用性、隔离性)、组件通信…...
Apache Hive:基于Hadoop的分布式数据仓库
Apache Hive 是一个基于 Apache Hadoop 构建的开源分布式数据仓库系统,支持使用 SQL 执行 PB 级大规模数据分析与查询。 主要功能 Apache Hive 提供的主要功能如下。 HiveServer2 HiveServer2 服务用于支持接收客户端连接和查询请求。 HiveServer2 支持多客户端…...
langgraph简单Demo3(画一个简单的图)
文章目录 画图简单解析再贴结果图 画图 from langgraph.graph import StateGraph, END from typing import TypedDict# 定义状态结构 # (刚入门可能不理解这是什么,可以理解为一个自定义的变量库,你的所有的入参出参都可以定义在这里) # 如下࿱…...
LCR 187. 破冰游戏(python3解法)
难度:简单 社团共有 num 位成员参与破冰游戏,编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target,从 0 号成员起开始计数,排在第 target 位的成员离开圆桌,且成员离开后从下一个成员开始计数…...
10分钟打造专属AI助手!ToDesk云电脑/顺网云/海马云操作DeepSeek哪家强?
文章目录 一、引言云计算平台概览ToDesk云电脑:随时随地用上高性能电脑 二 .云电脑初体验DeekSeek介绍版本参数与特点任务类型表现 1、ToDesk云电脑2、顺网云电脑3、海马云电脑 三、DeekSeek本地化实操和AIGC应用1. ToDesk云电脑2. 海马云电脑3、顺网云电脑 四、结语…...
解决 Element UI 嵌套弹窗显示灰色的问题!!!
解决 Element UI 嵌套弹窗显示灰色的问题 🔍 问题描述 ❌ 在使用 Element UI 开发 Vue 项目时,遇到了一个棘手的问题:当在一个弹窗(el-dialog)内部再次打开另一个弹窗时,第二个弹窗会显示为灰色,影响用户体验。 问题…...
【大模型】DeepSeek攻击原理和效果解析
前几天看到群友提到一个现象,在试图询问知识库中某个人信息时,意外触发了DeepSeek的隐私保护机制,使模型拒绝回答该问题。另有群友提到,Ollama上有人发布过DeepSeek移除模型内置审查机制的版本。于是顺着这条线索,对相…...
AI对软件工程(software engineering)的影响在哪些方面?
AI对软件工程(software engineering)的影响是全方位且深远的,它不仅改变了传统开发流程,还重新定义了工程师的角色和软件系统的构建方式。以下是AI影响软件工程的核心维度: 一、开发流程的智能化重构 需求工程革命 • …...
K8S学习之基础四十五:k8s中部署elasticsearch
k8s中部署elasticsearch 安装并启动nfs服务yum install nfs-utils -y systemctl start nfs systemctl enable nfs.service mkdir /data/v1 -p echo /data/v1 *(rw,no_root_squash) >> /etc/exports exports -arv systemctl restart nfs创建运行nfs-provisioner需要的sa账…...
部署高可用PostgreSQL14集群
目录 基础依赖包安装 consul配置 patroni配置 vip-manager配置 pgbouncer配置 haproxy配置 验证 本文将介绍如何使用Patroni、Consul、vip-manager、Pgbouncer、HaProxy组件来部署一个3节点的高可用、高吞吐、负载均衡的PostgresSQL集群(14版本)&…...
爬虫案例-爬取某站视频
文章目录 1、下载FFmpeg2、爬取代码3、效果图 1、下载FFmpeg FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。 点击下载: ffmpeg 安装并配置 FFmpeg 步骤: 1.下载 FFmpeg: 2.访问 FFmpeg 官网。 3.选择 Wi…...
PV操作指南
🔥《PV操作真香指南——看完就会的祖传攻略》🍵 一、灵魂三问❓ Q1:PV是个啥? • 💡 操作系统界的红绿灯:控制进程"何时走/何时停"的神器 • 🧱 同步工具人:解决多进程&q…...
计算机考研复试机试-考前速记
考前速记 知识点 1. 链表篇 1. 循环链表报数3,输出最后一个报数编号 #include <iostream> using namespace std;typedef struct Node {int no;struct Node* next; }Node, *NodeList;void createNodeListTail(NodeList&L, int n) {L (Node*)malloc(siz…...
【漏洞复现】Next.js中间件权限绕过漏洞 CVE-2025-29927
什么是Next.js? Next.js 是由 Vercel 开发的基于 React 的现代 Web 应用框架,具备前后端一体的开发能力,广泛用于开发 Server-side Rendering (SSR) 和静态站点生成(SSG)项目。Next.js 支持传统的 Node.js 模式和基于边…...
路由选型终极对决:直连/静态/动态三大类型+华为华三思科配置差异,一张表彻底讲透!
路由选型终极对决:直连/静态/动态三大类型华为华三思科配置差异,一张表彻底讲透! 一、路由:互联网世界的导航系统二、路由类型深度解析三者的本质区别 三、 解密路由表——网络设备的GPS华为(Huawei)华三&a…...
【AI】知识蒸馏-简单易懂版
1 缘起 最近要准备升级材料,里面有一骨碌是介绍LLM相关技术的,知识蒸馏就是其中一个点, 不过,只分享了蒸馏过程,没有讲述来龙去脉,比如没有讲解Softmax为什么引入T、损失函数为什么使用KL散度,…...
uniapp运行到支付宝开发者工具
使用uniapp编写专有钉钉和浙政钉出现的样式问题 在支付宝开发者工具中启用2.0构建的时候,在开发工具中页面样式正常 但是在真机调试和线上的时候不正常 页面没问题,所有组件样式丢失 解决 在manifest.json mp-alipay中加入 "styleIsolation&qu…...
STM32学习笔记之keil使用记录
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
卷积神经网络 - 参数学习
本文我们通过两个简化的例子,展示如何从前向传播、损失计算,到反向传播推导梯度,再到参数更新,完整地描述卷积层的参数学习过程。 一、例子一 我们构造一个非常简单的卷积神经网络,其结构仅包含一个卷积层和一个输出…...
【加密社】币圈合约交易量监控,含TG推送
首先需要在币安的开发者中心去申请自己的BINANCE_API_KEY和BINANCE_API_SECRET 有了这个后,接着去申请一个TG的机器人token和对话chatid 如果不需要绑定tg推送的话,可以忽略这步 接下来直接上代码 引用部分 from os import system from binance.c…...
大模型概述
大模型属于Foundation Model(基础模型)[插图],是一种神经网络模型,具有参数量大、训练数据量大、计算能力要求高、泛化能力强、应用广泛等特点。与传统人工智能模型相比,大模型在参数规模上涵盖十亿级、百亿级、千亿级…...
【CSS3】完整修仙功法
目录 CSS 基本概念CSS 的定义CSS 的作用CSS 语法 CSS 引入方式内部样式表外部样式表行内样式表 选择器基础选择器标签选择器类选择器id 选择器通配符选择器 画盒子文字控制属性字体大小字体粗细字体倾斜行高字体族font 复合属性文本缩进文本对齐文本修饰线文字颜色 复合选择器后…...
C++ 的 if-constexpr
1 if-constexpr 语法 1.1 基本语法 if-constexpr 语法是 C 17 引入的新语法特性,也被称为常量 if 表达式或静态 if(static if)。引入这个语言特性的目的是将 C 在编译期计算和求值的能力进一步扩展,更方便地实现编译期的分支…...
【电气设计】接地/浮地设计
在工作的过程中,遇到了需要测量接地阻抗的情况,组内讨论提到了保护接地和功能接地的相关需求。此文章用来记录这个过程的学习和感悟。 人体触电的原理: 可以看到我们形成了电流回路,导致触电。因此我们需要针对设备做一些保护设计…...
Gone v2 配置管理3:连接 Nacos 配置中心
🚀 发现 gone-io/gone:一个优雅的 Go 依赖注入框架!💻 它让您的代码更简洁、更易测试。🔍 框架轻量却功能强大,完美平衡了灵活性与易用性。⭐ 如果您喜欢这个项目,请给我们点个星!&a…...
深度强化学习中的深度神经网络优化策略:挑战与解决方案
I. 引言 深度强化学习(Deep Reinforcement Learning,DRL)结合了强化学习(Reinforcement Learning,RL)和深度学习(Deep Learning)的优点,使得智能体能够在复杂的环境中学…...
浅拷贝与深拷贝
浅拷贝和深拷贝是对象复制中的两种常见方式,它们在处理对象的属性时有本质的区别。 一. 浅拷贝(Shallow Copy) 浅拷贝是指创建一个新对象,然后将当前对象的非静态字段复制到新对象中。如果字段是值类型的,那么将复制字…...
macOS 安装 Miniconda
macOS 安装 Miniconda 1. Quickstart install instructions2. 执行3. shell 上初始化 conda4. 关闭 终端登录用户名前的 base参考 1. Quickstart install instructions mkdir -p ~/miniconda3 curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o…...
分布式限流方案:基于 Redis 的令牌桶算法实现
分布式限流方案:基于 Redis 的令牌桶算法实现 前言一、原理介绍:令牌桶算法二、分布式限流的设计思路三、代码实现四、方案优缺点五、 适用场景总结 前言 在分布式场景下,接口限流变得更加复杂。传统的单机限流方式难以满足跨节点的限流需求…...
OpenHarmony子系统开发 - 电池管理(二)
OpenHarmony子系统开发 - 电池管理(二) 五、充电限流限压定制开发指导 概述 简介 OpenHarmony默认提供了充电限流限压的特性。在对终端设备进行充电时,由于环境影响,可能会导致电池温度过高,因此需要对充电电流或电…...
Cocos Creator版本发布时间线
官网找不到,DeepSeek给的答案,这里做个记录。 Cocos Creator 1.x 系列 发布时间:2016 年 - 2018 年 1.0(2016 年 3 月): 首个正式版本,基于 Cocos2d-x 的 2D 游戏开发工具链,集成可…...
修形还是需要再研究一下
最近有不少小伙伴问到修形和蜗杆砂轮的问题,之前虽然研究过一段时间,但是由于时间问题放下了,最近想再捡起来。 之前计算的砂轮齿形是一整段的,但是似乎这种对于有些小伙伴来说不太容易接受,希望按照修形的区域进行分…...
Java面试黄金宝典11
1. 什么是 JMM 内存模型 定义 JMM(Java Memory Model)即 Java 内存模型,它并非真实的物理内存结构,而是一种抽象的概念。其主要作用是规范 Java 虚拟机与计算机主内存(Main Memory)之间的交互方式&#x…...
华为p10 plus 鸿蒙2.0降级emui9.1.0.228
需要用到的工具 HiSuite Proxy V3 华为手机助手11.0.0.530_ove或者11.0.0.630_ove应该都可以。 官方的通道已关闭,所以要用代理,127.0.0.1端口7777 https://www.firmfinder.ml/ https://professorjtj.github.io/v2/ https://hisubway.online/articl…...
高速开源镜像站网址列表2503
高速开源镜像站网址列表 以下是国内常用的高速开源镜像站网址列表,涵盖企业和教育机构的主要站点,适用于快速下载开源软件和系统镜像: 一、企业镜像站 阿里云镜像站 地址:https://mirrors.aliyun.com/ 特点:覆盖广泛…...
Python----计算机视觉处理(Opencv:绘制图像轮廓:寻找轮廓,findContours()函数)
一、轮廓 轮廓是图像中目标物体或区域的外部边界线或边界区域,由一系列相连的像素构成封闭形状,代表了物体的基本外形。与边缘不同,轮廓是连续的,而边缘则不一定是连续的。 轮廓与边缘的区别: 轮廓是一组连续的点或线…...