Reactor 事件流 vs. Spring 事件 (ApplicationEvent)
Reactor 事件流 vs. Spring 事件 ApplicationEvent
- Reactor 事件流 vs. Spring 事件 (`ApplicationEvent`)
- 1️⃣ 核心区别
- 2️⃣ Spring 事件 (`ApplicationEvent`)
- ✅ 示例:Spring 事件发布 & 监听
- 1️⃣ 定义事件
- 2️⃣ 发布事件
- 3️⃣ 监听事件
- 🔹 进阶:异步监听
- 3️⃣ Reactor 事件流(`Flux` / `Mono` / `Sinks.Many`)
- ✅ 示例:事件流处理
- 1️⃣ 冷流(每个订阅者独立获取数据)
- ✅ 方法 1:使用 `Flux.create()`,手动推送数据
- **✅ 方法 2:使用 `Flux.generate()`,按需推送数据**
- **✅ 方法 3:使用 `Sinks.many().multicast()`,支持多个订阅者**
- **✅ 结论**
- 2️⃣ 热流(共享事件流)
- **📌 ReplayProcessor:可重放历史事件的 Reactor 处理器**
- **📌 1️⃣ 关键特点**
- **📌 2️⃣ 基本使用**
- **📌 运行结果**
- **📌 3️⃣ `ReplayProcessor` vs `Sinks.Many`**
- **📌 4️⃣ 适用场景**
- 4️⃣ 什么时候用哪个?
- 5️⃣ 总结
Reactor 事件流 vs. Spring 事件 (ApplicationEvent
)
1️⃣ 核心区别
特性 | Spring ApplicationEvent | Reactor Flux /Sinks.Many |
---|---|---|
数据处理方式 | 一次性事件(同步或异步) | 流式处理(持续事件流) |
是否支持多个订阅者 | ✅ 支持(多个 @EventListener ) | ✅ 支持(Sinks.Many 广播) |
是否支持流式操作 | ❌ 不支持 | ✅ 支持(map() , filter() , zip() ) |
是否支持回放历史事件 | ❌ 不支持 | ❌(默认不支持,但可用 ReplayProcessor ) |
适用场景 | 业务事件通知(用户注册、订单支付) | 高吞吐数据流处理(日志、消息队列、WebFlux) |
2️⃣ Spring 事件 (ApplicationEvent
)
🔹 特点
- 适用于应用内部组件通信,解耦业务逻辑。
- 默认同步,可使用
@Async
进行异步处理。 - 一次性事件,无法流式处理。
✅ 示例:Spring 事件发布 & 监听
1️⃣ 定义事件
public class UserRegisteredEvent extends ApplicationEvent {private final String username;public UserRegisteredEvent(Object source, String username) {super(source);this.username = username;}public String getUsername() { return username; }
}
2️⃣ 发布事件
@Component
public class UserService {@Autowiredprivate ApplicationEventPublisher eventPublisher;public void registerUser(String username) {eventPublisher.publishEvent(new UserRegisteredEvent(this, username));}
}
3️⃣ 监听事件
@Component
public class WelcomeEmailListener {@EventListenerpublic void handleUserRegisteredEvent(UserRegisteredEvent event) {System.out.println("📧 发送欢迎邮件给: " + event.getUsername());}
}
可多个 @EventListener
监听同一个事件,同时触发
@Component
public class LoggingListener {@EventListenerpublic void logUserRegisteredEvent(UserRegisteredEvent event) {System.out.println("📜 记录日志: 用户 " + event.getUsername() + " 已注册");}
}
@Component
public class PointsRewardListener {@EventListenerpublic void giveWelcomePoints(UserRegisteredEvent event) {System.out.println("🎁 赠送 100 积分给: " + event.getUsername());}
}
🔹 进阶:异步监听
🔹 1️⃣ 监听器可以指定异步 需要启用 Spring 异步,@EnableAsync
@Async
@EventListener
public void sendWelcomeEmail(UserRegisteredEvent event) {System.out.println("📧 发送欢迎邮件给: " + event.getUsername() + " [异步]");
}
🔹 2️⃣ 监听多个事件 如果多个事件需要相同的处理逻辑,你可以用 classes
监听多个事件:
@EventListener(classes = {UserRegisteredEvent.class, OrderPlacedEvent.class})
public void handleMultipleEvents(Object event) {System.out.println("📢 事件触发: " + event.getClass().getSimpleName());
}
🔹 3️⃣ 条件监听 可以使用 condition
属性,让监听器只处理 符合条件 的事件:
@EventListener(condition = "#event.username.startsWith('A')")
public void handleUserStartingWithA(UserRegisteredEvent event) {System.out.println("🎯 处理用户名以 A 开头的用户: " + event.getUsername());
}
🔹 适用场景 ✅ 适用于业务事件通知(如用户注册、订单支付)。 ❌ 不适用于流式数据处理。
3️⃣ Reactor 事件流(Flux
/ Mono
/ Sinks.Many
)
🔹 特点
- 异步 & 流式 处理,可以并行、合并、过滤、转换数据。
- 冷流(Flux、Mono) 每个订阅者独立处理数据。
- 热流(Sinks.Many) 可用于事件广播。
✅ 示例:事件流处理
1️⃣ 冷流(每个订阅者独立获取数据)
Flux<String> flux = Flux.just("事件1", "事件2", "事件3");
flux.subscribe(event -> System.out.println("订阅者 1 收到: " + event));
flux.subscribe(event -> System.out.println("订阅者 2 收到: " + event));
✅ 方法 1:使用 Flux.create()
,手动推送数据
import reactor.core.publisher.Flux;
import reactor.core.publisher.FluxSink;import java.time.Duration;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class CustomFluxExample {public static void main(String[] args) throws InterruptedException {Flux<String> customFlux = Flux.create(emitter -> {Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {String event = "自定义事件:" + System.currentTimeMillis();System.out.println("发布:" + event);emitter.next(event);}, 0, 1, TimeUnit.SECONDS);}, FluxSink.OverflowStrategy.BUFFER);// 订阅者 1customFlux.subscribe(event -> System.out.println("订阅者 1 收到:" + event));Thread.sleep(5000); // 5 秒后再添加订阅者// 订阅者 2customFlux.subscribe(event -> System.out.println("订阅者 2 收到:" + event));Thread.sleep(10000); // 让主线程等待一会儿,看效果}
}
🔹 运行结果
python-repl复制编辑发布:自定义事件:1712101234567
订阅者 1 收到:自定义事件:1712101234567
发布:自定义事件:1712101235567
订阅者 1 收到:自定义事件:1712101235567
发布:自定义事件:1712101236567
订阅者 1 收到:自定义事件:1712101236567
发布:自定义事件:1712101237567
订阅者 1 收到:自定义事件:1712101237567
发布:自定义事件:1712101238567
订阅者 1 收到:自定义事件:1712101238567
(5 秒后,订阅者 2 加入)
订阅者 2 收到:自定义事件:1712101239567
订阅者 1 收到:自定义事件:1712101239567
发布:自定义事件:1712101240567
订阅者 2 收到:自定义事件:1712101240567
订阅者 1 收到:自定义事件:1712101240567
...
📌 特点
-
你可以随时手动推送数据(每 1 秒发布一次)。
-
新订阅者不会收到历史数据,只会接收到之后的事件(如果你想让新订阅者也能收到历史数据,可以用
.replay()
)。示例:
Flux<String> flux = Flux.just("事件A", "事件B", "事件C").replay(2) // 缓存最后 2 个事件.autoConnect(); // 至少一个订阅者连接后开始发布flux.subscribe(event -> System.out.println("订阅者 1 收到: " + event));// 新的订阅者会从缓存中接收事件 flux.subscribe(event -> System.out.println("订阅者 2 收到: " + event));
输出:
订阅者 1 收到: 事件A 订阅者 1 收到: 事件B 订阅者 1 收到: 事件C 订阅者 2 收到: 事件B 订阅者 2 收到: 事件C
-
不会自动结束,Flux 会一直运行。
✅ 方法 2:使用 Flux.generate()
,按需推送数据
如果你的数据是基于前一个数据计算出来的,可以使用 Flux.generate()
:
import reactor.core.publisher.Flux;import java.time.Duration;
import java.util.concurrent.atomic.AtomicInteger;public class GenerateFluxExample {public static void main(String[] args) throws InterruptedException {Flux<String> generatedFlux = Flux.generate(() -> new AtomicInteger(1), // 初始状态(state, sink) -> {String event = "事件 " + state.getAndIncrement();System.out.println("发布:" + event);sink.next(event);try { Thread.sleep(1000); } catch (InterruptedException e) {}return state;});// 订阅者 1generatedFlux.subscribe(event -> System.out.println("订阅者 1 收到:" + event));Thread.sleep(5000); // 5 秒后再添加订阅者// 订阅者 2generatedFlux.subscribe(event -> System.out.println("订阅者 2 收到:" + event));Thread.sleep(10000);}
}
🔹 运行结果
python-repl复制编辑发布:事件 1
订阅者 1 收到:事件 1
发布:事件 2
订阅者 1 收到:事件 2
发布:事件 3
订阅者 1 收到:事件 3
发布:事件 4
订阅者 1 收到:事件 4
发布:事件 5
订阅者 1 收到:事件 5
(5 秒后,订阅者 2 加入)
发布:事件 6
订阅者 1 收到:事件 6
订阅者 2 收到:事件 6
发布:事件 7
订阅者 1 收到:事件 7
订阅者 2 收到:事件 7
...
📌 区别
Flux.generate()
一次只能推送一个数据,适合基于状态逐步生成数据。Flux.create()
可以异步推送多个数据,适合事件流、网络请求等异步数据。
✅ 方法 3:使用 Sinks.many().multicast()
,支持多个订阅者
如果你希望多个订阅者可以同时消费,并且可以随时加入:
import reactor.core.publisher.Flux;
import reactor.core.publisher.Sinks;import java.time.Duration;public class SinkExample {public static void main(String[] args) throws InterruptedException {Sinks.Many<String> sink = Sinks.many().multicast().onBackpressureBuffer();Flux<String> flux = sink.asFlux();// 订阅者 1flux.subscribe(event -> System.out.println("订阅者 1 收到:" + event));// 模拟定时推送数据new Thread(() -> {int i = 1;while (true) {String event = "事件 " + i++;System.out.println("发布:" + event);sink.tryEmitNext(event);try { Thread.sleep(1000); } catch (InterruptedException e) { }}}).start();Thread.sleep(5000); // 5 秒后再添加订阅者// 订阅者 2flux.subscribe(event -> System.out.println("订阅者 2 收到:" + event));Thread.sleep(10000);}
}
🔹 运行结果
python-repl复制编辑发布:事件 1
订阅者 1 收到:事件 1
发布:事件 2
订阅者 1 收到:事件 2
发布:事件 3
订阅者 1 收到:事件 3
发布:事件 4
订阅者 1 收到:事件 4
发布:事件 5
订阅者 1 收到:事件 5
(5 秒后,订阅者 2 加入)
发布:事件 6
订阅者 1 收到:事件 6
订阅者 2 收到:事件 6
发布:事件 7
订阅者 1 收到:事件 7
订阅者 2 收到:事件 7
...
📌 特点
Sinks.many().multicast()
允许多个订阅者同时消费。- 适用于 WebSocket、事件总线、消息队列等场景。
✅ 结论
方式 | 特点 | 适用场景 |
---|---|---|
Flux.create() | 手动推送数据,支持异步 | 适合事件流、消息队列、WebSocket |
Flux.generate() | 按需推送,每次一个 | 适合基于前一个状态生成新数据 |
Sinks.many().multicast() | 支持多个订阅者,实时推送 | 适合多订阅者共享数据 |
2️⃣ 热流(共享事件流)
Sinks.Many<String> sink = Sinks.many().multicast().onBackpressureBuffer();
Flux<String> hotFlux = sink.asFlux();hotFlux.subscribe(event -> System.out.println("订阅者 1 收到: " + event));
hotFlux.subscribe(event -> System.out.println("订阅者 2 收到: " + event));sink.tryEmitNext("全局事件 1");
sink.tryEmitNext("全局事件 2");
🔹 适用场景 ✅ 适用于高吞吐、异步、多订阅者的事件流。 ✅ 适用于数据流式处理(如 WebFlux、消息队列、日志流)。 ❌ 不适用于简单的业务事件通知。
📌 ReplayProcessor:可重放历史事件的 Reactor 处理器
ReplayProcessor<T>
是 Reactor 提供的一种 热流(Hot Publisher),它允许新的订阅者 回放之前发送的事件。适用于 日志系统、消息队列、数据缓存 等场景。
📌 1️⃣ 关键特点
✅ 存储历史事件,新的订阅者可以看到之前的事件。
✅ 类似 RxJava 的 ReplaySubject
,可以 指定缓存大小。
✅ 适用于需要回放数据的场景,如 日志系统、WebSocket 消息队列。
📌 2️⃣ 基本使用
import reactor.core.publisher.ReplayProcessor;public class ReplayProcessorExample {public static void main(String[] args) {// 创建 ReplayProcessor,缓存 2 条数据ReplayProcessor<String> processor = ReplayProcessor.create(2);// 订阅者 1 订阅processor.subscribe(data -> System.out.println("订阅者 1 收到:" + data));// 发送数据processor.onNext("事件 A");processor.onNext("事件 B");processor.onNext("事件 C");// 订阅者 2 订阅processor.subscribe(data -> System.out.println("订阅者 2 收到:" + data));// 发送更多数据processor.onNext("事件 D");}
}
📌 运行结果
mathematica复制编辑订阅者 1 收到:事件 A
订阅者 1 收到:事件 B
订阅者 1 收到:事件 C
订阅者 2 收到:事件 B // 只回放最近 2 条(事件 B 和 C)
订阅者 2 收到:事件 C
订阅者 1 收到:事件 D
订阅者 2 收到:事件 D
📌 说明:
ReplayProcessor.create(2)
最多缓存 2 条数据,新订阅者只能收到最近的 2 条事件。- 订阅者 1 先订阅,它会收到所有事件。
- 订阅者 2 后订阅,但它可以收到最近的 2 条缓存(事件 B 和 C)。
📌 3️⃣ ReplayProcessor
vs Sinks.Many
特性 | ReplayProcessor | Sinks.Many (Multicast) |
---|---|---|
是否缓存历史数据 | ✅ 是,可指定缓存大小 | ❌ 否,不会缓存历史数据 |
新订阅者是否能收到旧数据 | ✅ 可以 | ❌ 不能 |
适用场景 | 回放数据,如日志、历史消息 | 实时消息推送,不存储历史 |
📌 4️⃣ 适用场景
✅ 日志回放(新订阅者也能看到之前的日志)。
✅ 聊天系统(新加入的用户可以看到最近的聊天记录)。
✅ 数据缓存(保存最近 N 条数据,避免重复请求)。
🚀 如果你需要 缓存历史数据,并让新的订阅者能收到过去的事件,ReplayProcessor
是一个很好的选择!
4️⃣ 什么时候用哪个?
✅ 使用 ApplicationEvent
(Spring 事件)
- 简单的应用事件通知(如用户注册、邮件通知、订单完成)。
- 解耦业务逻辑,但不需要流式处理。
✅ 使用 Reactor 事件流
- 高吞吐、并发的数据流(日志流、消息流、WebFlux)。
- 多个订阅者同时消费事件,如广播消息、实时数据推送。
✅ 结合使用(最佳实践)
@EventListener
public void handleUserRegisteredEvent(UserRegisteredEvent event) {Flux.just(event).map(e -> "处理事件: " + e.getUsername()).doOnNext(System.out::println).subscribe();
}
5️⃣ 总结
方案 | 订阅者是否独立 | 事件是否广播 | 适用场景 |
---|---|---|---|
Spring ApplicationEvent | ✅ 每个订阅者独立 | ❌ 不是广播 | 业务事件通知 |
Reactor Flux (冷流) | ✅ 每个订阅者独立 | ❌ 不是广播 | 流式数据处理 |
Reactor Sinks.Many (热流) | ❌ 共享数据流 | ✅ 所有订阅者都收到 | 事件驱动架构 |
🚀 如果你是做 WebFlux、日志流、消息队列,选 Reactor!如果是应用内部事件解耦,选 Spring ApplicationEvent
! 🎯
相关文章:
Reactor 事件流 vs. Spring 事件 (ApplicationEvent)
Reactor 事件流 vs. Spring 事件 ApplicationEvent Reactor 事件流 vs. Spring 事件 (ApplicationEvent)1️⃣ 核心区别2️⃣ Spring 事件 (ApplicationEvent)✅ 示例:Spring 事件发布 & 监听1️⃣ 定义事件2️⃣ 发布事件3️⃣ 监听事件🔹 进阶&…...
Google开源机器学习框架TensorFlow探索更多ViT优化
一、在边缘设备优化ViTa 在边缘设备上优化 ViT(Vision Transformer)模型,主要目标是减少计算量、降低功耗、提升推理速度。以下是几种关键优化策略: 1.轻量级 ViT 变体 部分 ViT 变体专为边缘设备优化,包括…...
docker - compose up - d`命令解释,重复运行会覆盖原有容器吗
docker - compose up - d`命令解释,重复运行会覆盖原有容器吗 docker - compose up - d 是一个用于管理 Docker 容器的命令,具体含义如下: 命令含义: up:用于创建、启动并运行容器,会根据 docker - compose.yml 文件中定义的服务配置来操作。-d:表示以“分离模式”(det…...
火山dts迁移工具使用
登录后选择生态工具。(数据库传输服务DTS) 先选region 创建迁移任务 假设,mysql 选择专有网络(一般上云到火山都是专有网络) 【先选】结构迁移,全量,这些 【再选】迁移对象 (他们产研有bug,先…...
Tabby 一:如何在Mac配置保姆级教程(本地模型替换hugging face下载)
1. brew安装 mac需要先安装brew,如果本地已经安装过brew这一步可以忽略,遇到问题可以自己ai问 /bin/bash -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 可能遇到source .zprofile失败,因为…...
Go 语言标准库中time模块详细功能介绍与示例
以下是 Go 语言 time 模块的详细说明及示例,涵盖时间操作、定时器、时区处理等核心功能: 一、时间基础操作 1. 获取时间 // 当前本地时间 now : time.Now() fmt.Println(now) // 2023-08-04 15:30:45.123456 0800 CST// 构造指定时间 t : time.Date(20…...
做的一些实验
先在DRMPlane::Perform函数里,把PLANE_SET_SRC_RECT或者PLANE_SET_DST_RECT设置的DRMProperty::SRC_W DRMProperty::SRC_H或者DRMProperty::CRTC_W DRMProperty::CRTC_H设置为原来1/2,都无法启动Android界面。 后来思考了一下,Log里好像打印…...
计算机网络基础:网络流量工程与优化策略
计算机网络基础:网络流量工程与优化策略 一、前言二、网络流量工程基础2.1 网络流量工程的定义与目标2.2 网络流量的测量与分析2.2.1 常用的流量测量方法2.2.2 流量数据分析三、网络流量工程的优化策略3.1 链路负载均衡策略3.1.1 基于目的地址的负载均衡3.1.2 基于流量权重的负…...
Python入门学习笔记 - 从环境搭建到基础语法
一、前期准备工作 1. 系统环境配置 防火墙设置与网络连接检查 2. 网络查看 二、计算机基础知识 1. 硬件系统 2. 计算机系统组成 三、Python简介 1. Python的特点 2. Python安装注意事项 四、Python基础语法 1. 注释的分类 2. IDE使用技巧 字体大小随滚轮滑动设置 3.…...
重温:时间窗口与滑动步长的概念
核心概念 窗口大小(Window Size) 定义窗口包含的时间步数(如过去7天、24小时等)。例如,窗口大小为5时,每个窗口包含连续的5个时间点数据。 滑动步长(Step/Stride) 窗口每次向前移动…...
数据库——MySQL字符、日期函数
一、字符函数详解 1. CONCAT() - 字符串拼接 作用:连接多个字符串,类似Java中的号。 语法: CONCAT(string1, string2, ...) 示例: SELECT CONCAT(Hello, , World) AS greeting; -- 输出:Hello World 2. UPPER()…...
Vue3.5 企业级管理系统实战(十一):全屏切换组件
本篇主要探讨如何在导航栏(Navbar)中添加全屏切换按钮,并借助功能强大的 screenfull 插件,丝滑实现全屏切换功能,为用户打造更为便捷、流畅的交互体验。 1 安装插件 screenfull screenfull 是一个轻量级的 JavaScript…...
HAL_UARTEx_ReceiveToIdle_DMA 开启,但是无法进入空闲中断;
HAL_UART_Receive_IT HAL_UARTEx_ReceiveToIdle_DMA 解决措施,关闭HAL_UART_Receive_IT函数; 因为这个函数会开启start_receive 函数中断,这个函数 将标志位一直置busy,导致一直没有进入空闲中断设置;...
第30周Java分布式入门 分布式基础
分布式基础课程笔记 一、什么是分布式? 1. 权威定义 分布式系统定义为:“利用物理架构形成多个自治的处理元素,不共享主内存,通过发送消息合作”。 2. 核心解释 物理架构与处理元素 🌟 多台独立服务器/电脑&#x…...
【商城实战(82)】区块链赋能用户身份验证:从理论到源码实践
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
一周掌握Flutter开发--9. 与原生交互(上)
文章目录 9. 与原生交互核心场景9.1 调用平台功能:MethodChannel9.1.1 Flutter 端实现9.1.2 Android 端实现9.1.3 iOS 端实现9.1.4 使用场景 9.2 使用社区插件9.2.1 常用插件9.2.2 插件的优势 总结 9. 与原生交互 Flutter 提供了强大的跨平台开发能力,但…...
DeepSeek-V3-0324对比OpenAI GPT-4o和Gemini 2.5 Pro
以下是DeepSeek-V3-0324、OpenAI GPT-4o与谷歌Gemini 2.5 Pro模型的更新点及优化对比总结: 1. DeepSeek-V3-0324 开源地址:https://huggingface.co/deepseek-ai/DeepSeek-V3-0324 核心更新与优化 性能提升: 采用6850亿参数MoE架构ÿ…...
【AI论文】LEGO拼图:大型语言模型在多步骤空间推理方面的表现如何?
摘要:多步骤空间推理涉及跨多个顺序步骤理解和推理空间关系,这对于解决复杂的现实世界应用至关重要,如机器人操作、自主导航和自动化装配。为了评估当前多模态大型语言模型(MLLMs)在获取这一基本能力方面的表现&#x…...
【深度学习】【目标检测】【OnnxRuntime】【C++】YOLOV5模型部署
【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONNXRuntime推…...
vcpkg安装指定版本的库
一.vcpkg安装 使用git将vcpkg源码克隆到本地制定目录(D:\vcpkg),并初始化 git clone https://github.com/microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh # Linux/macOS .\bootstrap-vcpkg.bat # Windows 如下图: 二.安…...
springboot 四层架构之间的关系整理笔记五
问题:service 和 多个serviceimpl 分层之间的逻辑关系? 好的!用班级活动的例子继续讲,假设班长(Service接口)要管理多种任务,而不同的班委(ServiceImpl实现类)负责不同场…...
记录一次交易耗时有毛刺TDSQL数据库排查过程
信息同步非常重要,解决问题前,务必从应用获取实例信息、sql关键字、问题时间段、问题描述。 处理步骤: 1、登陆赤兔,打开实例监控信息,检查CPU、内存、IO、缓冲命中率、proxy汇总请求量耗时情况,初步判断…...
爱普生晶体单元FC2012AN在5G RedCap中的应用
在 5G 技术向物联网领域深度渗透的今天,RedCap(5G 轻量化)作为衔接中高速物联网场景的关键技术,正加速推动工业、医疗、可穿戴等领域的智能化升级。爱普生 FC2012AN 低 ESR 晶体单元凭借其突破性的小尺寸、低功耗与高稳定性设计&a…...
Linux: 网络,arp的数量为什么会对交换机/路由器有性能的影响
这个问题也是非常普遍的问题。比如最近比较火的一个OVS相关的问题: ARP request packets put high pressure on the pinctrl thread in ovn-controller 另一个在工作种也遇到了相似的问题,当一个网络里发了同时发了小一百个GARP之后,路由器的gateway就会有ARP处理延迟。 A…...
javaWeb vue的简单语法
一、简介 两大核心优势: 声明式渲染:Vue 基于标准 HTML 拓展了一套模板语法,使得我们可以声明式地描述最终输出的 HTML 和 JavaScript 状态之间的关系。 响应性:Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 D…...
Android 中隐藏标题栏和状态栏的方法
在Android开发中,隐藏标题栏和状态栏是实现全屏显示的常见需求。 一、隐藏标题栏 1、通过代码隐藏 对于继承自 AppCompatActivity 的 Activty,可在 onCreate() 方法中调用supportRequestWindowFeature 或 getSupportActionBar 方法来隐藏标题栏。 ove…...
Tof 深度相机原理
深度相机(TOF)的工作原理_tof相机原理-CSDN博客 深度剖析 ToF 技术:原理、优劣、数据纠错与工业应用全解析_tof技术-CSDN博客 飞行时间技术TOF_tof计算公式-CSDN博客 深度相机(二)——飞行时间(TOF)_飞行时间技术-C…...
boost.asio
as(async):异步 同步io: reactor (非阻塞)(需要注册一次,在等待消息时可以干别的事) 阻塞io网络模型 接口:read\accept\connect\write 接口返回时,io完成 异步…...
Python 装饰器(Decorators)
什么是装饰器? 装饰器(Decorator)本质上是一个 修改其他函数功能的函数。它的核心思想是:不修改原函数代码,动态添加新功能。比如: 记录函数执行时间 检查用户权限 缓存计算结果 自动重试失败操作 理解…...
django orm的优缺点
Django ORM(对象关系映射)是 Django 框架的核心组件之一,它通过将数据库表映射为 Python 类,简化了数据库操作。以下是其优缺点总结: 优点 开发效率高 用 Python 类定义数据模型,无需手写 SQL,…...
国产RISC-V车规芯片当前现状分析——从市场与技术角度出发
摘要 随着汽车产业的智能化、电动化转型加速,车规级芯片的战略地位日益凸显。RISC-V指令集凭借其开源、灵活、低功耗等优势,成为国产车规芯片的重要发展方向。本文从市场与技术两个维度出发,深入分析国产RISC-V车规芯片的现状。通过梳理国内…...
不落因果与不昧因果
在佛教浩瀚的哲学体系中,“因果”是贯穿修行始终的核心命题。而“不落因果”与“不昧因果”这对看似矛盾的概念,恰似明镜的两面,映照出修行者对因果法则的不同认知层次。二者虽仅一字之差,却如天堑般分隔了迷悟两岸,其…...
《论语别裁》第02章 为政(08) 诗的伟大
孔子说我整理诗三百篇的宗旨在什么地方?“一言以蔽之”——一句话,“思无邪”。人不能没有思想,只要是思想不走歪曲的路,引导走上正路就好,譬如男女之爱。如果作学问的人,男女之爱都不能要,世界…...
在学校图书馆知识库中进行论文检索报告生成
首先登录信息门户—>科研服务—>机构知识库 在成果认领页面,查看自己的成果情况。如果发现自己的有些成果未被录入,可以发邮件给管理员。 最后,进入成果管理,选择需要的成果进行检索报告的生成...
《寒门枭雄传》章回体拟目与故事设计
《寒门枭雄传》章回体拟目与故事设计 主题:寒门逆袭的制度性困境与个人成长的撕裂性代价 第一回 贩履郎寒冬逢逼债 落魄汉雪夜定从戎 地点:京口草鞋摊→北府军营 人物:刘裕、刁逵(士族豪强)、刘母 故事: …...
头歌 | Linux之用户高级管理
若未实现预期结果, 可私信我帮你解答 2025-3-28 第1关:创建/删除用户组 > /data/workspace/myshixun/case1/evaluating.sh # 写入新内容 echo "echo 创建newGroup用户组成功 创建newGroupID用户组成功 设置newGroupID用户组ID成功 删除oldGroup用户组成功…...
常用的测试用例
登录、添加、删除、查询模块是我们经常遇到的,这些模块的测试点该如何考虑 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求,密码不符合要求(格式上的要求) ④ 密码符合要求…...
数据结构与算法——顺序表的实现以及增、插、删、查、印、毁
文章目录 一、前言二、顺序表的概念与结构2.1顺序表的概念2.2顺序表的结构 三、顺序表的分类3.1静态顺序表3.1.1静态顺序表的弊端 3.2动态顺序表3.2.1动态顺序表的相对利弊3.2.2动态顺序表的增容方式 四、顺序表的增、插、删、查、印、毁4.1 顺序表的增容4.2顺序表的尾插和头插…...
环境 tensorflow ERROR: No matching distribution found for ai-edge-litert
提示:环境搭建 文章目录 前言多依赖安装 前言 提示:版本 之前文章 condajupyter 环境搭建 PyTorch 2.6 cpu 环境搭建 系统 :ubuntu 22.0 python :3.8 ERROR: No matching distribution found for ai-edge-litert PyTorch: sta…...
基于深度强化学习的智能机器人路径规划技术研究
在人工智能与机器人技术飞速发展的今天,智能机器人在工业、服务、物流等领域的应用日益广泛。路径规划作为智能机器人运动的核心技术之一,直接影响机器人的工作效率和安全性。近年来,深度强化学习(Deep Reinforcement Learning, D…...
【ManiSkill】环境success条件和reward函数学习笔记
1. “PickCube-v1” info["success"]:用于指示任务是否成功完成 布尔型张量,在环境的evaluate()方法中计算并返回: "success": is_obj_placed & is_robot_static这确保了机器人不仅能将物体准确放置在目标位置&am…...
畅捷通T+与吉客云数据集成案例解析
畅捷通T与吉客云的高效数据集成案例分享 在企业信息化系统中,数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将聚焦于一个具体的系统对接集成案例:如何将畅捷通T中的采购入库单(红字)数据无缝集成到吉客云中࿰…...
Vue 项目中使用$refs来访问组件实例或 DOM 元素,有哪些注意事项?
大白话Vue 项目中使用$refs来访问组件实例或 DOM 元素,有哪些注意事项? 在 Vue 项目里,$refs 是个超实用的工具,它能让你直接访问组件实例或者 DOM 元素。不过使用的时候,有一些地方可得注意,下面咱就详细…...
Docker Compose 基础知识
一. Docker Compose 引言 Docker Compose 是 Docker 官方提供的一个用于定义和运行多容器 Docker 应用程序的工具。它通过一个yaml格式的配置文件(通常命名为 docker-compose.yml ),文件中定义多个服务、网络和卷,从而简化复杂应…...
科技赋能|ZGIS综合管网智能管理平台守护地下城市生命线
地下管网作为城市公共安全的重要组成部分,担负着城市的信息传递、能源输送、排涝减灾等重要任务,是维系城市正常运行、满足群众生产生活需要的重要基础设施,是城市各功能区有机连接和运转的维系,因此,也被称为城市“生…...
EXCEL报错:无法共享此工作薄,因表包含excel表或xml映射的解决方法
在分享工作薄是,如果出现了“无法共享此工作薄,因表包含excel表或xml映射”的报错,那么有两个原因: 1.包含Excel表格,这个也是相对比较常见的原因。 首先选中表格。如果你不知道表的位置在哪,那么在Excel左…...
Go 语言标准库中path模块详细功能介绍与示例
Go语言的 path 模块提供了处理斜杠分隔路径的通用方法,适用于跨平台路径操作(如 URL 路径或 Unix 风格路径)。以下是 path 模块的核心方法及示例说明: 1. path.Base 返回路径的最后一个元素(类似 Unix 的 basename 命…...
在Vue 3 + TypeScript + Vite 项目中安装和使用 SCSS
在Vue 3 TypeScript Vite 项目中安装和使用 SCSS 1、安装 SCSS 的相关依赖 npm install sass --save-dev2、配置 Vite 对于 Vue 3,Vite 已经内置了对 SCSS 的支持,通常不需要额外的配置。但是,如果需要自定义配置,可以在路径…...
洛谷题单1-B2005 字符三角形-python-流程图重构
题目描述 给定一个字符,用它构造一个底边长 5 5 5 个字符,高 3 3 3 个字符的等腰字符三角形。 输入格式 输入只有一行,包含一个字符。 输出格式 该字符构成的等腰三角形,底边长 5 5 5 个字符,高 3 3 3 个字符…...
实现金蝶与钉钉无缝对接以高效管理银行账号信息
【资料】金蝶&钉钉—银行账号 在企业信息化管理中,数据的高效集成和实时同步至关重要。本文将分享一个实际的系统对接集成案例:如何将金蝶云星空的数据集成到钉钉平台,实现银行账号信息的无缝对接。 本次集成方案【资料】金蝶&钉钉…...