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

如何理解响应式编程

思考:

分析Netty与Reactor背压协调策略

用户的问题是关于如何在 Netty 和 Project Reactor 联合使用时处理背压问题,特别是当 Reactor 的处理速度跟不上 Netty 的事件产生速度时该怎么办。这是一个技术性很强的问题,涉及到 Netty 的非阻塞特性、Reactor 的背压机制以及两者之间的协调。我需要先明确用户的需求和潜在意图。

首先,用户提到 Netty 和 Reactor 的联合使用,这表明他们可能在构建一个高性能的异步系统,比如一个高并发的服务器。Netty 负责处理网络事件,而 Reactor 用于处理数据流和背压。用户的核心问题是如何在 Reactor 处理速度较慢时避免被 Netty 的高速事件淹没,这说明他们关注的是系统的稳定性和资源保护。

接下来,我需要思考如何结合 Netty 和 Reactor 的特性来解决这个问题。Netty 的非阻塞特性意味着它会尽可能快地处理网络事件,而 Reactor 提供了背压机制,可以通过订阅者控制数据流的速度。两者的结合点在于如何将 Netty 的事件流转化为 Reactor 可以管理的数据流,并利用 Reactor 的背压机制来调节 Netty 的处理速度。

我首先想到的是 Reactor 的 FluxMono,它们是数据流的核心组件,支持背压控制。通过将 Netty 的事件包装成 Reactor 的数据流,可以利用 Reactor 的请求机制来限制 Netty 的事件传递速度。比如,订阅者可以通过 request(n) 方法明确告诉发布者它能处理多少数据,从而避免被过多的事件压垮。

然后,我考虑到 Reactor 的 BaseSubscriber,它允许更细粒度的背压控制。通过重写 hookOnSubscribehookOnNext 方法,可以在订阅时设置初始请求量,并在处理每个事件时动态调整请求量。这种方式适合处理速度波动较大的场景。

此外,我还需要考虑 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 是基于响应式编程的,它通过 FluxMono 等数据流结构来处理异步事件。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`,我们实现了对数据流的精细控制,避免了处理速度较慢时的数据堆积问题。

相关文章:

如何理解响应式编程

思考&#xff1a; 分析Netty与Reactor背压协调策略 用户的问题是关于如何在 Netty 和 Project Reactor 联合使用时处理背压问题&#xff0c;特别是当 Reactor 的处理速度跟不上 Netty 的事件产生速度时该怎么办。这是一个技术性很强的问题&#xff0c;涉及到 Netty 的非阻塞特…...

Python网络编程入门

一.Socket 简称套接字&#xff0c;是进程之间通信的一个工具&#xff0c;好比现实生活中的插座&#xff0c;所有的家用电器要想工作都是基于插座进行&#xff0c;进程之间要想进行网络通信需要Socket&#xff0c;Socket好比数据的搬运工~ 2个进程之间通过Socket进行相互通讯&a…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例14,TableView15_14多功能组合的导出表格示例

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例14,TableView15_14多功…...

鸿蒙特效教程10-卡片展开/收起效果

鸿蒙特效教程10-卡片展开/收起效果 在移动应用开发中&#xff0c;卡片是一种常见且实用的UI元素&#xff0c;能够将信息以紧凑且易于理解的方式呈现给用户。 本教程将详细讲解如何在HarmonyOS中实现卡片的展开/收起效果&#xff0c;通过这个实例&#xff0c;你将掌握ArkUI中状…...

如何创建一个socket服务器?

1. 导入必要的库 首先&#xff0c;需要导入Python的socket库&#xff0c;它提供了创建和管理socket连接的功能。 python import socket 2. 创建服务器端socket 使用socket.socket()函数创建一个服务器端的socket对象&#xff0c;指定协议族&#xff08;如socket.AF_INET表示…...

react自定义hook

自定义hook&#xff1a; 用来封装复用的逻辑&#xff0c;&#xff0c;自定义hook是以use开头的普通函数&#xff0c;&#xff0c;将组件中可复用的状态逻辑抽取到自定义的hook中&#xff0c;简化组件代码 常见自定义hook例子&#xff1a; 封装一个简单的计数器 import {useS…...

Android Compose 框架的状态与 ViewModel 的协同(collectAsState)深入剖析(二十一)

Android Compose 框架的状态与 ViewModel 的协同&#xff08;collectAsState&#xff09;深入剖析 一、引言 在现代 Android 应用开发中&#xff0c;构建响应式和动态的用户界面是至关重要的。Android Compose 作为新一代的声明式 UI 工具包&#xff0c;为开发者提供了一种简…...

系统与网络安全------网络应用基础(1)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 TCP/IP协议及配置 概述 TCP/IP协议族 计算机之间进行通信时必须共同遵循的一种通信规定 最广泛使用的通信协议的集合 包括大量Internet应用中的标准协议 支持跨网络架构、跨操作系统平台的数据通信 主机…...

linux常用指令(6)

今天我们继续学习一些linux常用指令,丰富我们linux基础知识,那么话不多说,来看. 1.cp指令 功能描述&#xff1a;拷贝文件到指定目录 基本语法&#xff1a;cp [选项] source dest 常用选项&#xff1a;-r&#xff1a;递归复制整个文件夹 拷贝文件&#xff1a; 拷贝文件夹&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) 模式也称单例模式/单态模式&#xff0c;是一种创建型模式&#xff0c;用于创建只能产生 一个对象实例 的类。该模式比较特殊&#xff0c;其实现代码中没有用到设计模式中经常提起的抽象概念&#xff0c;而是使用了一种比较特殊的语法结构&#x…...

C++类与对象的第二个简单的实战练习-3.24笔记

哔哩哔哩C面向对象高级语言程序设计教程&#xff08;118集全&#xff09; 实战二 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 是当下主流的分布式版本控制工具&#xff0c;在软件开发、文档管理等方面用处极大。它能自动记录文件改动&#xff0c;简化合并流程&#xff0c;还特别适合多人协作开发。学会 Git&#xff0c;就相当于掌握了一把通往开源世界的钥匙&#xff0c;以后参与…...

前端框架学习路径与注意事项

学习前端框架是一个系统化的过程&#xff0c;需要结合理论、实践和工具链的综合掌握。以下是学习路径的关键方面和注意事项&#xff1a; 一、学习路径的核心方面 1. 基础概念与核心思想 组件化开发&#xff1a;理解组件的作用&#xff08;复用性、隔离性&#xff09;、组件通信…...

Apache Hive:基于Hadoop的分布式数据仓库

Apache Hive 是一个基于 Apache Hadoop 构建的开源分布式数据仓库系统&#xff0c;支持使用 SQL 执行 PB 级大规模数据分析与查询。 主要功能 Apache Hive 提供的主要功能如下。 HiveServer2 HiveServer2 服务用于支持接收客户端连接和查询请求。 HiveServer2 支持多客户端…...

langgraph简单Demo3(画一个简单的图)

文章目录 画图简单解析再贴结果图 画图 from langgraph.graph import StateGraph, END from typing import TypedDict# 定义状态结构 # (刚入门可能不理解这是什么&#xff0c;可以理解为一个自定义的变量库&#xff0c;你的所有的入参出参都可以定义在这里) # 如下&#xff1…...

LCR 187. 破冰游戏(python3解法)

难度&#xff1a;简单 社团共有 num 位成员参与破冰游戏&#xff0c;编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target&#xff0c;从 0 号成员起开始计数&#xff0c;排在第 target 位的成员离开圆桌&#xff0c;且成员离开后从下一个成员开始计数…...

10分钟打造专属AI助手!ToDesk云电脑/顺网云/海马云操作DeepSeek哪家强?

文章目录 一、引言云计算平台概览ToDesk云电脑&#xff1a;随时随地用上高性能电脑 二 .云电脑初体验DeekSeek介绍版本参数与特点任务类型表现 1、ToDesk云电脑2、顺网云电脑3、海马云电脑 三、DeekSeek本地化实操和AIGC应用1. ToDesk云电脑2. 海马云电脑3、顺网云电脑 四、结语…...

解决 Element UI 嵌套弹窗显示灰色的问题!!!

解决 Element UI 嵌套弹窗显示灰色的问题 &#x1f50d; 问题描述 ❌ 在使用 Element UI 开发 Vue 项目时&#xff0c;遇到了一个棘手的问题&#xff1a;当在一个弹窗(el-dialog)内部再次打开另一个弹窗时&#xff0c;第二个弹窗会显示为灰色&#xff0c;影响用户体验。 问题…...

【大模型】DeepSeek攻击原理和效果解析

前几天看到群友提到一个现象&#xff0c;在试图询问知识库中某个人信息时&#xff0c;意外触发了DeepSeek的隐私保护机制&#xff0c;使模型拒绝回答该问题。另有群友提到&#xff0c;Ollama上有人发布过DeepSeek移除模型内置审查机制的版本。于是顺着这条线索&#xff0c;对相…...

AI对软件工程(software engineering)的影响在哪些方面?

AI对软件工程&#xff08;software engineering&#xff09;的影响是全方位且深远的&#xff0c;它不仅改变了传统开发流程&#xff0c;还重新定义了工程师的角色和软件系统的构建方式。以下是AI影响软件工程的核心维度&#xff1a; 一、开发流程的智能化重构 需求工程革命 • …...

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集群&#xff08;14版本&#xff09;&…...

爬虫案例-爬取某站视频

文章目录 1、下载FFmpeg2、爬取代码3、效果图 1、下载FFmpeg FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。 点击下载: ffmpeg 安装并配置 FFmpeg 步骤&#xff1a; 1.下载 FFmpeg&#xff1a; 2.访问 FFmpeg 官网。 3.选择 Wi…...

PV操作指南

&#x1f525;《PV操作真香指南——看完就会的祖传攻略》&#x1f375; 一、灵魂三问❓ Q1&#xff1a;PV是个啥&#xff1f; • &#x1f4a1; 操作系统界的红绿灯&#xff1a;控制进程"何时走/何时停"的神器 • &#x1f9f1; 同步工具人&#xff1a;解决多进程&q…...

计算机考研复试机试-考前速记

考前速记 知识点 1. 链表篇 1. 循环链表报数3&#xff0c;输出最后一个报数编号 #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&#xff1f; Next.js 是由 Vercel 开发的基于 React 的现代 Web 应用框架&#xff0c;具备前后端一体的开发能力&#xff0c;广泛用于开发 Server-side Rendering (SSR) 和静态站点生成&#xff08;SSG&#xff09;项目。Next.js 支持传统的 Node.js 模式和基于边…...

路由选型终极对决:直连/静态/动态三大类型+华为华三思科配置差异,一张表彻底讲透!

路由选型终极对决&#xff1a;直连/静态/动态三大类型华为华三思科配置差异&#xff0c;一张表彻底讲透&#xff01; 一、路由&#xff1a;互联网世界的导航系统二、路由类型深度解析三者的本质区别 三、 解密路由表——网络设备的GPS华为&#xff08;Huawei&#xff09;华三&a…...

【AI】知识蒸馏-简单易懂版

1 缘起 最近要准备升级材料&#xff0c;里面有一骨碌是介绍LLM相关技术的&#xff0c;知识蒸馏就是其中一个点&#xff0c; 不过&#xff0c;只分享了蒸馏过程&#xff0c;没有讲述来龙去脉&#xff0c;比如没有讲解Softmax为什么引入T、损失函数为什么使用KL散度&#xff0c;…...

uniapp运行到支付宝开发者工具

使用uniapp编写专有钉钉和浙政钉出现的样式问题 在支付宝开发者工具中启用2.0构建的时候&#xff0c;在开发工具中页面样式正常 但是在真机调试和线上的时候不正常 页面没问题&#xff0c;所有组件样式丢失 解决 在manifest.json mp-alipay中加入 "styleIsolation&qu…...

STM32学习笔记之keil使用记录

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

卷积神经网络 - 参数学习

本文我们通过两个简化的例子&#xff0c;展示如何从前向传播、损失计算&#xff0c;到反向传播推导梯度&#xff0c;再到参数更新&#xff0c;完整地描述卷积层的参数学习过程。 一、例子一 我们构造一个非常简单的卷积神经网络&#xff0c;其结构仅包含一个卷积层和一个输出…...

【加密社】币圈合约交易量监控,含TG推送

首先需要在币安的开发者中心去申请自己的BINANCE_API_KEY和BINANCE_API_SECRET 有了这个后&#xff0c;接着去申请一个TG的机器人token和对话chatid 如果不需要绑定tg推送的话&#xff0c;可以忽略这步 接下来直接上代码 引用部分 from os import system from binance.c…...

大模型概述

大模型属于Foundation Model&#xff08;基础模型&#xff09;[插图]&#xff0c;是一种神经网络模型&#xff0c;具有参数量大、训练数据量大、计算能力要求高、泛化能力强、应用广泛等特点。与传统人工智能模型相比&#xff0c;大模型在参数规模上涵盖十亿级、百亿级、千亿级…...

【CSS3】完整修仙功法

目录 CSS 基本概念CSS 的定义CSS 的作用CSS 语法 CSS 引入方式内部样式表外部样式表行内样式表 选择器基础选择器标签选择器类选择器id 选择器通配符选择器 画盒子文字控制属性字体大小字体粗细字体倾斜行高字体族font 复合属性文本缩进文本对齐文本修饰线文字颜色 复合选择器后…...

C++ 的 if-constexpr

1 if-constexpr 语法 1.1 基本语法 ​ if-constexpr 语法是 C 17 引入的新语法特性&#xff0c;也被称为常量 if 表达式或静态 if&#xff08;static if&#xff09;。引入这个语言特性的目的是将 C 在编译期计算和求值的能力进一步扩展&#xff0c;更方便地实现编译期的分支…...

【电气设计】接地/浮地设计

在工作的过程中&#xff0c;遇到了需要测量接地阻抗的情况&#xff0c;组内讨论提到了保护接地和功能接地的相关需求。此文章用来记录这个过程的学习和感悟。 人体触电的原理&#xff1a; 可以看到我们形成了电流回路&#xff0c;导致触电。因此我们需要针对设备做一些保护设计…...

Gone v2 配置管理3:连接 Nacos 配置中心

&#x1f680; 发现 gone-io/gone&#xff1a;一个优雅的 Go 依赖注入框架&#xff01;&#x1f4bb; 它让您的代码更简洁、更易测试。&#x1f50d; 框架轻量却功能强大&#xff0c;完美平衡了灵活性与易用性。⭐ 如果您喜欢这个项目&#xff0c;请给我们点个星&#xff01;&a…...

深度强化学习中的深度神经网络优化策略:挑战与解决方案

I. 引言 深度强化学习&#xff08;Deep Reinforcement Learning&#xff0c;DRL&#xff09;结合了强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;和深度学习&#xff08;Deep Learning&#xff09;的优点&#xff0c;使得智能体能够在复杂的环境中学…...

浅拷贝与深拷贝

浅拷贝和深拷贝是对象复制中的两种常见方式&#xff0c;它们在处理对象的属性时有本质的区别。 一. 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝是指创建一个新对象&#xff0c;然后将当前对象的非静态字段复制到新对象中。如果字段是值类型的&#xff0c;那么将复制字…...

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 的令牌桶算法实现

分布式限流方案&#xff1a;基于 Redis 的令牌桶算法实现 前言一、原理介绍&#xff1a;令牌桶算法二、分布式限流的设计思路三、代码实现四、方案优缺点五、 适用场景总结 前言 在分布式场景下&#xff0c;接口限流变得更加复杂。传统的单机限流方式难以满足跨节点的限流需求…...

OpenHarmony子系统开发 - 电池管理(二)

OpenHarmony子系统开发 - 电池管理&#xff08;二&#xff09; 五、充电限流限压定制开发指导 概述 简介 OpenHarmony默认提供了充电限流限压的特性。在对终端设备进行充电时&#xff0c;由于环境影响&#xff0c;可能会导致电池温度过高&#xff0c;因此需要对充电电流或电…...

Cocos Creator版本发布时间线

官网找不到&#xff0c;DeepSeek给的答案&#xff0c;这里做个记录。 Cocos Creator 1.x 系列 发布时间&#xff1a;2016 年 - 2018 年 1.0&#xff08;2016 年 3 月&#xff09;&#xff1a; 首个正式版本&#xff0c;基于 Cocos2d-x 的 2D 游戏开发工具链&#xff0c;集成可…...

修形还是需要再研究一下

最近有不少小伙伴问到修形和蜗杆砂轮的问题&#xff0c;之前虽然研究过一段时间&#xff0c;但是由于时间问题放下了&#xff0c;最近想再捡起来。 之前计算的砂轮齿形是一整段的&#xff0c;但是似乎这种对于有些小伙伴来说不太容易接受&#xff0c;希望按照修形的区域进行分…...

Java面试黄金宝典11

1. 什么是 JMM 内存模型 定义 JMM&#xff08;Java Memory Model&#xff09;即 Java 内存模型&#xff0c;它并非真实的物理内存结构&#xff0c;而是一种抽象的概念。其主要作用是规范 Java 虚拟机与计算机主内存&#xff08;Main Memory&#xff09;之间的交互方式&#x…...

华为p10 plus 鸿蒙2.0降级emui9.1.0.228

需要用到的工具 HiSuite Proxy V3 华为手机助手11.0.0.530_ove或者11.0.0.630_ove应该都可以。 官方的通道已关闭&#xff0c;所以要用代理&#xff0c;127.0.0.1端口7777 https://www.firmfinder.ml/ https://professorjtj.github.io/v2/ https://hisubway.online/articl…...

高速开源镜像站网址列表2503

高速开源镜像站网址列表 以下是国内常用的高速开源镜像站网址列表&#xff0c;涵盖企业和教育机构的主要站点&#xff0c;适用于快速下载开源软件和系统镜像&#xff1a; 一、企业镜像站 阿里云镜像站 地址&#xff1a;https://mirrors.aliyun.com/ 特点&#xff1a;覆盖广泛…...

Python----计算机视觉处理(Opencv:绘制图像轮廓:寻找轮廓,findContours()函数)

一、轮廓 轮廓是图像中目标物体或区域的外部边界线或边界区域&#xff0c;由一系列相连的像素构成封闭形状&#xff0c;代表了物体的基本外形。与边缘不同&#xff0c;轮廓是连续的&#xff0c;而边缘则不一定是连续的。 轮廓与边缘的区别&#xff1a; 轮廓是一组连续的点或线…...