Vert.x学习笔记-EventLoop工作原理

article/2025/7/13 14:32:37

Vert.x学习笔记

      • Vert.x Event Loop 的工作原理
        • 1. 核心设计理念
        • 2. 事件循环的执行流程
        • 3. 线程绑定与上下文
        • 4. 协作与任务委托
        • 5. 性能优化与注意事项
        • 6. 关键特性总结
      • 单线程事件循环(Event Loop)
        • 1. 什么是单线程事件循环?
        • 2. 用生活场景类比
        • 3. 单线程事件循环的工作流程
        • 4. 为什么单线程能高效?
        • 5. 单线程事件循环的注意事项
        • 6. 关键类比总结
        • 单线程事件循环总结
      • 单线程事件循环与多线程的关系
        • 1. 核心区别
        • 2. 为什么需要结合使用?
        • 3. 协作方式:以 Vert.x 为例
        • 4. 协作的关键点
        • 5. 类比总结
        • 6. 总结
      • 单线程事件循环的缺点
        • 1. 无法处理阻塞操作
        • 2. 不适合 CPU 密集型任务
        • 3. 线程崩溃导致系统不可用
        • 4. 线程数量限制导致并发瓶颈
        • 5. 调试和日志记录复杂
        • 6. 缺乏多线程的并行优势
        • 7. 线程上下文切换开销
        • 总结:单线程事件循环的缺点与适用场景
        • 何时使用单线程事件循环?
      • 总结


Event Loop 是 Vert.x 事件驱动架构的核心,负责高效处理非阻塞 I/O 和轻量级任务。其工作原理可拆解为以下关键环节,结合类比和示例进行说明:

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

Vert.x Event Loop 的工作原理


1. 核心设计理念
  • 单线程事件循环
    • 每个 Vert.x 实例为每个 CPU 核心分配一个 Event Loop 线程(默认数量 = 核心数)。
    • 线程通过**事件循环(Event Loop)**机制持续监听事件(如 I/O 完成、定时器触发),确保高效响应。
  • 非阻塞优先
    • Event Loop 线程严格避免阻塞操作(如同步 I/O、长时间计算),否则会阻塞整个线程,导致其他任务无法执行。

类比
Event Loop 线程类似餐厅的“前台服务员”,快速响应顾客(事件)的即时需求(如点餐、结账),而耗时任务(如烹饪)由后厨(Worker 线程池)处理。


2. 事件循环的执行流程
  1. 初始化

    • Vert.x 启动时,根据 CPU 核心数创建对应数量的 Event Loop 线程。
    • 每个线程绑定一个事件队列(Event Queue),用于存储待处理的事件。
  2. 事件监听与分发

    • Event Loop 线程持续轮询事件队列,检查是否有新事件到达。
    • 事件类型包括:
      • I/O 事件:如网络连接建立、数据接收完成。
      • 定时器事件:如 setTimersetPeriodic 触发。
      • 用户任务:如通过 runOnContext 提交的任务。
  3. 事件处理

    • Event Loop 线程从队列中取出事件,并执行对应的 Handler。
    • Handler 执行完毕后,线程立即返回事件循环,继续处理下一个事件。
  4. 避免阻塞

    • 如果 Handler 中包含阻塞操作(如数据库查询),必须通过 executeBlocking 或 Worker Verticle 委托给 Worker 线程池处理。

3. 线程绑定与上下文
  • 线程绑定
    • 每个 Verticle 实例默认绑定到一个 Event Loop 线程(除非显式部署为 Worker Verticle)。
    • 同一 Verticle 的所有 Handler 会在同一线程上顺序执行,确保线程安全。
  • 上下文切换
    • Vert.x 通过 Context 对象管理线程上下文,确保跨线程的任务(如 Worker 线程回调)能正确返回 Event Loop 线程。

示例

vertx.createHttpServer().requestHandler(req -> {// 同一 Verticle 的 Handler 会在同一 Event Loop 线程上执行System.out.println("Thread: " + Thread.currentThread().getName());req.response().end("Hello");
}).listen(8080);

4. 协作与任务委托
  • 与 Worker 线程池协作
    • Event Loop 线程通过 executeBlocking 将阻塞任务委托给 Worker 线程池:
      vertx.executeBlocking(future -> {// 阻塞操作(如数据库查询)String result = blockingDatabaseQuery();future.complete(result);
      }, res -> {// 回调结果返回 Event Loop 线程System.out.println("Result: " + res.result());
      });
      
  • 跨线程通信
    • Worker 线程或外部线程通过 vertx.runOnContext 将任务提交回 Event Loop 线程:
      vertx.runOnContext(v -> {// 在 Event Loop 线程上执行System.out.println("Running on Event Loop");
      });
      

5. 性能优化与注意事项
  • 避免阻塞
    • 任何阻塞操作(如 Thread.sleep、同步 I/O)都会阻塞 Event Loop 线程,导致系统响应延迟。
  • 轻量级任务
    • Event Loop 线程应仅处理轻量级任务(如 JSON 解析、简单计算),确保快速返回事件循环。
  • 线程数量调优
    • Event Loop 线程数量通常与 CPU 核心数一致(无需手动调整),但需确保任务均匀分配。

6. 关键特性总结
特性说明
单线程事件循环每个 Event Loop 线程独立运行,避免多线程竞争。
非阻塞优先严格禁止阻塞操作,确保线程高效运行。
线程绑定Verticle 的 Handler 默认绑定到同一 Event Loop 线程,确保线程安全。
任务委托通过 executeBlocking 或 Worker Verticle 将阻塞任务委托给 Worker 线程池。
上下文管理Vert.x 通过 Context 对象管理线程上下文,确保跨线程任务正确执行。

单线程事件循环(Event Loop)

1. 什么是单线程事件循环?

单线程事件循环是一种**“一个线程、无限循环”**的工作模式,核心思想是:
“一个线程一直转圈,不断检查有没有任务要做,有任务就执行,执行完继续转圈。”

2. 用生活场景类比

想象你在一家奶茶店当店员(单线程),你的工作就是按顺序处理顾客的订单事件循环):

  1. 轮询订单:你站在柜台前,眼睛一直盯着取餐号显示屏(事件队列),看有没有新订单。
  2. 处理订单
    • 如果屏幕显示“1号取餐”,你就开始做1号的奶茶(执行任务)。
    • 奶茶做好后,交给顾客(任务完成)。
  3. 继续轮询:做完1号的奶茶后,你立刻回到柜台前,继续看屏幕有没有新订单(返回循环)。

关键点

  • 你(线程)从头到尾只做一件事:检查订单 → 做奶茶 → 交奶茶 → 继续检查订单
  • 不会同时做两件事(比如一边做奶茶一边接电话),也不会中途停下来休息(除非没事可做)。
  • 如果订单太多(任务堆积),你会忙不过来,但绝不会偷懒(线程不会主动阻塞)。

3. 单线程事件循环的工作流程
  1. 初始化
    • 系统启动时,创建一个“店员”(Event Loop 线程),并给他一个订单显示屏(事件队列)。
  2. 事件监听
    • 店员一直盯着显示屏,等待新订单(事件)出现。
    • 订单可能是:
      • 顾客点奶茶(I/O 事件,如网络请求)。
      • 定时提醒(定时器事件,如每5分钟检查库存)。
      • 其他店员给你的任务(用户提交的任务)。
  3. 任务执行
    • 看到订单后,店员立刻开始做奶茶(执行 Handler)。
    • 奶茶做好后,交给顾客(回调结果)。
  4. 返回循环
    • 任务完成后,店员立刻回到柜台前,继续看屏幕(返回事件循环)。

4. 为什么单线程能高效?
  • 避免线程切换开销
    • 多线程像多个店员抢着做奶茶,但需要协调谁先做、谁后做(线程上下文切换),反而降低效率。
    • 单线程像只有一个店员,但做事专注,不用协调,效率反而更高。
  • 非阻塞设计
    • 如果做奶茶需要等原料(阻塞操作),店员会直接拒绝,让其他店员(Worker 线程池)帮忙做,自己继续处理其他订单。

5. 单线程事件循环的注意事项
  • 不能阻塞线程
    • 如果店员在做奶茶时突然开始玩手机(阻塞操作),所有订单都会被耽误(系统卡死)。
    • 必须把耗时任务(如查库存、等外卖)交给其他店员(Worker 线程池)。
  • 任务顺序执行
    • 订单是按顺序处理的(同一 Verticle 的 Handler 在同一线程执行),所以不用加锁(线程安全)。
  • 任务不能太重
    • 如果做一杯奶茶需要10分钟(长时间任务),店员会忙不过来,导致其他订单积压(系统响应变慢)。

6. 关键类比总结
单线程事件循环奶茶店店员
线程店员
事件队列取餐号显示屏
事件(任务)顾客订单
Handler做奶茶的过程
阻塞操作玩手机、等原料
Worker 线程池其他店员

单线程事件循环总结

单线程事件循环就像一个永不休息、专注做事的店员,通过**“轮询 → 执行 → 返回”**的循环模式,高效处理任务。

  • 优点:简单、高效、线程安全。
  • 缺点:不能阻塞,任务不能太重。
  • 解决方案:把耗时任务交给其他店员(Worker 线程池)。

通过这种设计,Vert.x 实现了高并发、低延迟的异步编程模型。


单线程事件循环与多线程的关系

单线程事件循环和多线程是两种不同的并发编程模型,但它们并非完全对立,而是可以互补协作,共同解决高并发场景下的性能问题。以下是两者的核心关系和协作方式:


1. 核心区别
特性单线程事件循环多线程
线程数量固定一个线程(如 Vert.x 的 Event Loop)多个线程(如线程池、手动创建线程)
任务执行方式顺序执行(通过事件循环轮询)并行执行(多线程同时运行)
适用场景非阻塞 I/O、轻量级任务阻塞操作、CPU 密集型任务
线程安全自动保证(同一线程内执行)需手动处理(如加锁、同步)
性能瓶颈阻塞操作会阻塞整个线程线程切换开销、线程竞争

2. 为什么需要结合使用?

单线程事件循环和多线程各有优劣,结合使用可以扬长避短

  • 单线程事件循环的短板

    • 无法处理阻塞操作(如数据库查询、文件 I/O),否则会阻塞整个线程,导致系统卡死。
    • 不适合 CPU 密集型任务(如复杂计算),否则会占用线程时间,无法及时响应其他事件。
  • 多线程的短板

    • 线程创建和销毁开销大。
    • 线程间竞争资源(如共享变量)需要加锁,增加复杂度。
    • 线程上下文切换会降低性能。

解决方案

  • 单线程事件循环处理非阻塞 I/O 和轻量级任务(如网络请求、定时器)。
  • 多线程处理阻塞操作和 CPU 密集型任务(如数据库查询、复杂计算)。

3. 协作方式:以 Vert.x 为例

Vert.x 通过Event Loop + Worker 线程池的组合,实现了单线程事件循环和多线程的协作:

  1. Event Loop 线程

    • 负责处理非阻塞 I/O(如 HTTP 请求、WebSocket 消息)。
    • 通过事件循环机制快速响应事件,确保高并发性能。
  2. Worker 线程池

    • 负责处理阻塞操作(如数据库查询、文件 I/O)。
    • 通过 executeBlocking 方法将阻塞任务委托给 Worker 线程池,避免阻塞 Event Loop 线程。

示例代码

vertx.createHttpServer().requestHandler(req -> {// Event Loop 线程处理非阻塞任务System.out.println("Event Loop Thread: " + Thread.currentThread().getName());// 将阻塞任务委托给 Worker 线程池vertx.executeBlocking(future -> {// Worker 线程执行阻塞操作System.out.println("Worker Thread: " + Thread.currentThread().getName());String result = blockingDatabaseQuery(); // 模拟阻塞操作future.complete(result);}, res -> {// 回调结果返回 Event Loop 线程System.out.println("Result on Event Loop: " + res.result());req.response().end("Result: " + res.result());});
}).listen(8080);

输出示例

Event Loop Thread: vert.x-eventloop-thread-1
Worker Thread: vert.x-worker-thread-2
Result on Event Loop: Data from database

4. 协作的关键点
  • 线程隔离
    • Event Loop 线程和 Worker 线程严格隔离,避免阻塞操作影响 Event Loop 的性能。
  • 任务委托
    • 通过 executeBlocking 或 Worker Verticle 将阻塞任务委托给 Worker 线程池。
  • 回调机制
    • Worker 线程通过回调将结果返回 Event Loop 线程,确保 Event Loop 线程可以继续处理其他事件。

5. 类比总结
场景单线程事件循环(Event Loop)多线程(Worker 线程池)
角色前台服务员(快速响应顾客需求)后厨厨师(处理耗时任务)
任务类型非阻塞任务(如点餐、结账)阻塞任务(如烹饪、洗碗)
协作方式服务员将耗时任务交给厨师,自己继续服务其他顾客厨师完成任务后,将结果交给服务员
优点高效、线程安全并发处理耗时任务

6. 总结
  • 单线程事件循环适合非阻塞 I/O 和轻量级任务,通过事件循环实现高并发。
  • 多线程适合阻塞操作和 CPU 密集型任务,通过并行执行提高性能。
  • 协作使用
    • Event Loop 线程处理快速响应的任务。
    • Worker 线程池处理耗时任务,避免阻塞 Event Loop 线程。

通过这种设计,Vert.x 等框架实现了高性能、低延迟、线程安全的异步编程模型。


单线程事件循环的缺点

单线程事件循环(如 Vert.x 的 Event Loop)通过一个线程、无限循环的机制实现高效的事件处理,但这种设计也存在明显的局限性。以下是其核心缺点及分析:


1. 无法处理阻塞操作
  • 问题
    • 单线程事件循环的核心是非阻塞设计,如果 Handler 中包含阻塞操作(如同步 I/O、Thread.sleep、数据库查询),会直接阻塞整个线程,导致系统无法响应其他事件。
  • 影响
    • 系统响应延迟:一个阻塞任务会卡住整个 Event Loop 线程,导致其他任务无法执行。
    • 吞吐量下降:Event Loop 线程被占用后,无法处理新事件,系统吞吐量急剧降低。
  • 解决方案
    • 必须将阻塞操作委托给 Worker 线程池(如 Vert.x 的 executeBlocking),但会增加代码复杂度。

2. 不适合 CPU 密集型任务
  • 问题
    • 单线程事件循环的线程是固定分配的,如果任务是 CPU 密集型(如复杂计算、图像处理),会长时间占用线程,导致其他事件无法及时处理。
  • 影响
    • 线程利用率低:CPU 密集型任务会占用线程时间,无法充分利用多核 CPU 的性能。
    • 系统卡顿:长时间运行的计算任务会阻塞 Event Loop 线程,导致系统响应变慢。
  • 解决方案
    • 将 CPU 密集型任务委托给 Worker 线程池,但 Worker 线程池的线程数量有限,可能仍会成为瓶颈。

3. 线程崩溃导致系统不可用
  • 问题
    • 单线程事件循环的线程是唯一的,如果线程因未捕获的异常崩溃,整个系统将无法处理事件,导致服务不可用。
  • 影响
    • 高可用性风险:单线程的设计没有容错机制,线程崩溃后需要依赖外部监控和重启。
    • 调试难度大:线程崩溃后,日志可能无法完整记录崩溃原因,调试复杂。
  • 解决方案
    • 必须通过异常捕获监控机制(如 Vert.x 的 UncaughtExceptionHandler)来避免线程崩溃。
    • 部署多个 Vert.x 实例实现高可用。

4. 线程数量限制导致并发瓶颈
  • 问题
    • Vert.x 默认根据 CPU 核心数创建 Event Loop 线程(通常 1~4 个),如果任务数量远超过线程数量,可能导致事件堆积。
  • 影响
    • 队列延迟:事件队列中的任务需要等待线程空闲后才能执行,导致响应延迟。
    • 吞吐量受限:线程数量固定,无法动态扩展以应对突发流量。
  • 解决方案
    • 优化任务设计,减少阻塞操作。
    • 部署多个 Vert.x 实例,通过负载均衡分散压力。

5. 调试和日志记录复杂
  • 问题
    • 单线程事件循环的线程是共享的,所有任务都在同一线程上执行,日志和调试信息可能交织在一起,难以定位问题。
  • 影响
    • 调试困难:多个任务的日志混杂在一起,难以区分任务边界。
    • 性能分析复杂:无法直接通过线程 ID 区分任务执行情况。
  • 解决方案
    • 使用 Vert.x 的 Context 和任务标识(如请求 ID)来区分日志。
    • 通过 APM 工具(如 New Relic、SkyWalking)进行性能监控。

6. 缺乏多线程的并行优势
  • 问题
    • 单线程事件循环无法利用多核 CPU 的并行计算能力,对于需要并行处理的任务(如大规模数据计算),效率低于多线程。
  • 影响
    • 计算密集型任务性能差:单线程无法并行执行计算任务,导致性能瓶颈。
    • 资源利用率低:CPU 核心可能空闲,而单线程仍在忙碌。
  • 解决方案
    • 将计算任务拆分为多个子任务,委托给 Worker 线程池并行处理。
    • 使用其他框架(如 Akka、Spark)处理计算密集型任务。

7. 线程上下文切换开销
  • 问题
    • 虽然单线程事件循环避免了多线程的上下文切换开销,但如果任务设计不合理(如频繁的回调嵌套),仍可能导致性能下降。
  • 影响
    • 回调地狱:过多的回调嵌套会导致代码难以维护,且性能下降。
    • 栈深度限制:单线程的栈深度有限,可能导致栈溢出。
  • 解决方案
    • 使用协程(如 Kotlin 的 Coroutine)或响应式编程(如 Reactor)简化代码。
    • 优化任务设计,减少回调嵌套。

总结:单线程事件循环的缺点与适用场景
缺点根本原因适用场景建议
无法处理阻塞操作单线程设计必须将阻塞操作委托给 Worker 线程池
不适合 CPU 密集型任务线程固定,无法并行CPU 密集型任务应委托给 Worker 线程池
线程崩溃导致系统不可用单线程无容错机制部署多个 Vert.x 实例,实现高可用
线程数量限制导致并发瓶颈Event Loop 线程数量固定优化任务设计,或部署多个 Vert.x 实例
调试和日志记录复杂线程共享,日志混杂使用 Context 和任务标识区分日志
缺乏多线程的并行优势单线程无法并行计算密集型任务应使用其他框架
线程上下文切换开销(回调嵌套)回调地狱导致性能下降使用协程或响应式编程简化代码

何时使用单线程事件循环?

单线程事件循环适合以下场景:

  1. 高并发 I/O 密集型任务:如 HTTP 服务器、WebSocket 服务。
  2. 需要低延迟的实时系统:如游戏服务器、实时聊天系统。
  3. 需要线程安全的轻量级任务:如 JSON 解析、简单计算。

对于阻塞操作、CPU 密集型任务,建议结合 Worker 线程池或使用其他框架(如多线程框架)。

通过合理设计,可以扬长避短,充分发挥单线程事件循环的优势。


总结

Vert.x Event Loop 的核心是通过单线程事件循环非阻塞设计实现高并发和低延迟。其工作原理可概括为:

  1. 事件驱动:通过事件队列和事件循环持续监听和处理事件。
  2. 线程绑定:确保同一 Verticle 的 Handler 在同一线程上顺序执行。
  3. 任务委托:将阻塞任务委托给 Worker 线程池,避免阻塞 Event Loop 线程。

在这里插入图片描述

Vert.x学习笔记-什么是Handler

spring中的@EnableAutoConfiguration注解详解

Vert.x学习笔记-什么是EventLoop


http://www.hkcw.cn/article/ZFjEfseYjr.shtml

相关文章

基于 HT for Web 的轻量化 3D 数字孪生数据中心解决方案

一、技术架构:HT for Web 的核心能力 图扑软件自主研发的 HT for Web 是基于 HTML5 的 2D/3D 可视化引擎,核心技术特性包括: 跨平台渲染:采用 WebGL 技术,支持 PC、移动端浏览器直接访问,兼容主流操作系统…

德国或将对美国科技巨头征收10%数字税

当地时间5月30日,新一届德国政府刚刚设立的联邦数字化与现代化部议会国务秘书菲利普阿姆托尔表示,尽管存在加剧与美国贸易紧张局势的风险,但德国仍在考虑对美国科技巨头征收10%的数字税。阿姆托尔表示,包括谷歌母公司“字母表”“元”公司等在内的美国多家大型科技巨头在德…

【航天远景 MapMatrix 精品教程】08 Pix4d空三成果导入MapMatrix

【航天远景 MapMatrix 精品教程】08 Pix4d空三成果导入MapMatrix 文章目录 【航天远景 MapMatrix 精品教程】08 Pix4d空三成果导入MapMatrix一、资料准备1.去畸变影像2.相机文件3.外方位元素二、创建工程1.新建工程2.导入照片3.编辑相机文件4.编辑外方位元素文件,导入外方位元…

【JavaWeb】JSP

目录 8. JSP8.1 什么是JSP8.2 JSP原理8.3 JSP基础语法8.4 JSP指令8.5 九大内置对象8.6 JSP标签、JSTL标签、EL表达式8.6.1 JSP标签(JSP Actions)定义:常见标签:示例代码:注意事项: 8.6.2 EL 表达式&#xf…

中国区域每月地下水水位栅格数据集(2005-2022)

时间分辨率:月空间分辨率:1km - 10km共享方式:开放获取数据大小:8.52 GB数据时间范围:2005-01-01 — 2022-12-01元数据更新时间:2024-09-09 数据集摘要 数据集“GWs_cn_1km”提供了2005年至2022年中国区域…

哪些岗位最易被AI替代?

随着AI技术高速演进,一场“职场大洗牌”正悄然上演。当ChatGPT出口成章、机器人能精准执勤,AI时代的“就业焦虑”已不再是空谈。你是否认真思考过,自己所处的岗位是否也正面临被AI边缘化的风险? 以下几类职业,已成为AI…

【实操】配置VLAN间路由

原创:厦门微思网络 点击查看【相关学习】 【干货】什么是VLAN? 【技术分享】常见VLAN部署方式 【必看】华为设备配置单臂路由实现VLAN间通信 实验目的 1. 理解VLAN间路由的原理 2. 掌握VLAN间路由的配置方法 实验拓扑 实验需求 1、根据实验拓扑图…

光谱相似度匹配算法设计

一、核心算法类型 ‌光谱角度匹配(SAM)‌ 通过计算两个光谱向量间的夹角评估相似性,夹角越小相似度越高。适用于高光谱遥感地物分类,对光照强度变化不敏感。 公式: 其中X/YX/Y为待比较光谱向量 ‌交叉相关匹配‌ 计…

RedisTemplate查询不到redis中的数据问题(序列化)

RedisTemplate查询不到redis中的数据问题(序列化) 一.问题描述 存入Redis中的值取出来却为null,问题根本原因就是RedisTemplate和StringRedisTemplate的序列化问题、代码示例: SpringBootTest class Redis02SpringbootApplicationTests {Autowiredprivate RedisTe…

SPI通信

第一章:SPI通信协议概述 SPI(串行外设接口)协议是一种由摩托罗拉公司开发的通信协议,它支持芯片与外部设备之间进行半双工或全双工、同步、串行的数据交换。该协议允许设备配置为主模式,为主设备提供通信时钟&#xff…

ArkUI--抽奖

摘要:本文展示了一个基于ArkUI的生肖抽奖应用实现。通过State管理当前选中索引(n1)、各卡片中奖次数(nums)和生肖图片资源(pics)。点击抽奖按钮时,启动15次循环动画后随机停在0-5索引位置,并在对应卡片Badge上累计中奖次数。界面包含32网格展…

平台对比:澳洲电商增速放缓期,Kogan如何实现38%客户增长?

过去三年,全球电商经历了一场从“井喷”到“冷静”的转变。澳洲市场也不例外。根据Statista数据显示,2023年澳大利亚整体电商零售增长仅为3.8%,远低于前两年的两位数增长。在这样的背景下,本土电商平台Kogan却逆势上扬&#xff0c…

差分S参数-信号与电源完整性分析

差分S参数: 由于差分互连中使用差分信号传递信息,接收器最关心的是差分信号的质量,如果互连通道的S参数能直接反映出对差分信号的影响,对分析问题将方便得多。差分互连通道可以看成是一个四端口网络,激励源为单端信号,…

计算机一次取数过程分析

计算机一次取数过程分析 1 取址过程 CPU由运算器和控制器组成,其中控制器中的程序计数器(PC)保存的是下一条指令的虚拟地址,经过内存管理单元(MMU),将虚拟地址转换为物理地址,之后交给主存地址寄存器(MAR),从主存中取…

鸿蒙OS的5.0.1.120版本体验怎么样?

点击上方关注 “终端研发部” 设为“星标”,和你一起掌握更多数据库知识 越来越是好用了,之前是凑合能用,现在是大多能用。 我朋友的mate30PRO和PuraX一起用,新系统确实满足我90%以上的需求 一个系统适配一款机型,是要…

CPT302 Multi-Agent Systems 题型

Agent games Wumpus World 乌普斯世界 设定 环境:一个二维网格状的洞穴(cave),由多个房间(rooms)组成。 起点:智能体(agent)总是从左下角的 Room[1,1] 开始。 连接方式…

太阳诱电多层陶瓷电容器的优势和特点

基于电容器市场需求或将扩大的方向性战略所开展的产品研发 除多层陶瓷电容器外,电容器还包括电解电容器和薄膜电容器等类型。随着节能化、物联网化的进一步加速发展,可以预见高性能电容器的需求量将在中长期内有所增长。 多层陶瓷电容器对于实现电子设…

Chrome v131.0.6778.86 绿色便携版 下载

Google Chrome浏览器增强版,采用shuax便携式Dll劫持补丁加入原版打包而成, Chrome增强软件模块,强制实现flash插件支持,解除Adobe Flash Player地区不相容限制和移除警告提示,增强标签页功能。 百度网盘:ht…

PYTHON调用讯飞唤醒实现麦克风说话机器人离线唤醒

引言 语音唤醒技术是现代智能语音交互系统中的重要组成部分,它允许设备在待机状态下通过特定的唤醒词进入交互状态。本文将介绍如何使用Python结合讯飞语音SDK实现一个简单的语音唤醒系统。 技术背景 语音唤醒技术主要依赖于以下几个关键技术点: 声学…

做销售讲究接地气

你有没有遇到过这种情况?两个人聊了半天,你越说对方越皱眉,最后礼貌地说"我再考虑考虑"。其实不是产品不够好,而是没戳中对方心里那根弦。做销售最讲究的就是"接地气"。 和人打交道就像炒菜,火候…