Vert.x学习笔记-EventLoop与Context的关系

article/2025/8/13 2:06:23

Vert.x学习笔记

      • 1. EventLoop 的核心作用
      • 2. Context 的核心作用
      • 3. EventLoop 与 Context 的关系
        • 1. 事件循环(EventLoop)的核心职责
        • 2. 上下文(Context)的核心职责
        • 3. 事件循环与上下文的关系
          • (1)一对一绑定
          • (2)任务调度协作
          • (3)线程安全保障
        • 4. 关键点总结
        • 5. 代码示例
        • 6. 总结
      • 4. 关键点总结
      • 5. 代码示例
        • 输出示例:
      • 6. 总结


在 Vert.x 中,EventLoop(事件循环)与 Context(上下文)是紧密关联的核心组件,它们共同协作以实现高效、非阻塞的异步编程模型。

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


在这里插入图片描述


1. EventLoop 的核心作用

  • 事件驱动:EventLoop 是 Vert.x 中处理 I/O 事件的核心机制,负责监听网络事件(如套接字读写)、定时任务等,并将这些事件分发给对应的处理器(Handler)。
  • 线程绑定:每个 EventLoop 通常绑定到一个固定的线程(在 Vert.x 中称为 VertxThread),确保事件处理的线程亲和性,避免线程切换的开销。
  • 非阻塞设计:EventLoop 必须保持非阻塞状态。如果在 EventLoop 线程中执行阻塞操作(如同步 I/O、长时间计算),会导致整个 EventLoop 线程阻塞,从而影响其他事件的及时处理。

2. Context 的核心作用

  • 执行上下文:Context 是 Vert.x 中用于封装和调度异步任务的上下文环境。它负责将任务提交到正确的线程(EventLoop 或 Worker 线程)中执行。
  • 线程隔离:Context 确保同一 Verticle 的所有事件处理逻辑在同一个线程(EventLoop 线程)中执行,避免多线程竞争问题。
  • 任务调度:Context 提供了 runOnContextexecuteBlocking 等方法,用于将任务提交到当前 Context 关联的线程中执行。

3. EventLoop 与 Context 的关系

  • 一对一绑定
    每个 Verticle 实例在部署时会被分配到一个 EventLoop,并绑定到一个对应的 Context。这个 Context 封装了该 Verticle 的所有事件处理逻辑,并确保这些逻辑在同一个 EventLoop 线程中执行。

  • 任务调度
    当 Verticle 中触发一个事件(如 HTTP 请求到达)时,Vert.x 会将该事件的处理任务提交到对应的 Context 中。Context 会将任务调度到绑定的 EventLoop 线程中执行。

  • 避免阻塞
    如果 Verticle 中需要执行阻塞操作(如数据库查询),可以通过 Context 的 executeBlocking 方法将任务提交到 Worker 线程池中执行,避免阻塞 EventLoop 线程。


在 Vert.x 中,事件循环(EventLoop)上下文(Context) 是紧密协作的核心组件,它们共同构成了 Vert.x 异步编程模型的基础。以下是它们之间关系的详细解析:


1. 事件循环(EventLoop)的核心职责
  • 事件处理引擎:EventLoop 是 Vert.x 中负责监听和处理 I/O 事件(如网络请求、定时任务等)的核心机制。它基于非阻塞 I/O 模型,通过事件驱动的方式处理高并发请求。
  • 线程绑定:每个 EventLoop 通常绑定到一个固定的线程(VertxThread),确保事件处理的线程亲和性。这种设计避免了线程切换的开销,提高了性能。
  • 非阻塞要求:EventLoop 线程必须保持非阻塞状态。如果在 EventLoop 线程中执行阻塞操作(如同步 I/O、长时间计算),会导致整个 EventLoop 线程阻塞,从而影响其他事件的及时处理。

2. 上下文(Context)的核心职责
  • 执行环境封装:Context 是 Vert.x 中用于封装和调度异步任务的上下文环境。它负责将任务提交到正确的线程(EventLoop 线程或 Worker 线程)中执行。
  • 线程隔离与亲和性:Context 确保同一 Verticle 的所有事件处理逻辑在同一个线程(EventLoop 线程)中执行,避免多线程竞争问题。这种线程亲和性是 Vert.x 高性能的关键。
  • 任务调度:Context 提供了 runOnContextexecuteBlocking 等方法,用于将任务提交到当前 Context 关联的线程中执行。

3. 事件循环与上下文的关系
(1)一对一绑定
  • Verticle 与 Context 的绑定
    每个 Verticle 实例在部署时会被分配到一个 Context。这个 Context 封装了该 Verticle 的所有事件处理逻辑,并确保这些逻辑在同一个线程中执行。
  • Context 与 EventLoop 的绑定
    每个 Context 通常绑定到一个 EventLoop 线程(即 Context 的 owner() 方法返回的线程)。这意味着同一 Verticle 的所有事件处理逻辑都会在同一个 EventLoop 线程中执行。
(2)任务调度协作
  • 非阻塞任务
    当 Verticle 中触发一个事件(如 HTTP 请求到达)时,Vert.x 会将该事件的处理任务提交到对应的 Context 中。Context 会将任务调度到绑定的 EventLoop 线程中执行。
  • 阻塞任务
    如果 Verticle 中需要执行阻塞操作(如数据库查询),可以通过 Context 的 executeBlocking 方法将任务提交到 Worker 线程池中执行,避免阻塞 EventLoop 线程。
(3)线程安全保障
  • 线程亲和性
    由于 Context 确保同一 Verticle 的所有事件处理逻辑在同一个 EventLoop 线程中执行,因此无需显式使用同步机制(如锁)来保护共享数据,从而简化了编程模型。
  • 避免多线程竞争
    Context 将任务隔离到不同的线程中执行(EventLoop 线程或 Worker 线程),避免了多线程竞争问题,提高了程序的稳定性和性能。

4. 关键点总结
  • 线程绑定关系
    每个 Verticle 实例绑定到一个 Context,每个 Context 绑定到一个 EventLoop 线程。这种层级关系确保了线程亲和性和非阻塞设计。
  • 任务调度机制
    Context 负责将任务提交到正确的线程中执行。非阻塞任务在 EventLoop 线程中执行,阻塞任务在 Worker 线程中执行。
  • 性能与稳定性
    通过线程亲和性和任务隔离,Vert.x 实现了高并发、低延迟的异步编程模型,同时避免了多线程竞争问题。

5. 代码示例

以下是一个简单的 Vert.x 示例,展示了 EventLoop 和 Context 的协作:

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Context;
import io.vertx.core.Vertx;
import io.vertx.core.eventloop.EventLoop;public class ExampleVerticle extends AbstractVerticle {@Overridepublic void start() {// 获取当前 Verticle 的 ContextContext context = vertx.getOrCreateContext();// 获取绑定的 EventLoopEventLoop eventLoop = context.owner();System.out.println("Current thread: " + Thread.currentThread().getName());System.out.println("Is EventLoop thread: " + context.isOnEventLoopThread());// 在 EventLoop 线程中执行任务context.runOnContext(v -> {System.out.println("Running on EventLoop thread: " + Thread.currentThread().getName());});// 执行阻塞操作(通过 Worker 线程)context.executeBlocking(promise -> {// 模拟阻塞操作try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}promise.complete("Blocking operation completed");}, res -> {System.out.println("Result: " + res.result());});}public static void main(String[] args) {Vertx vertx = Vertx.vertx();vertx.deployVerticle(new ExampleVerticle());}
}

6. 总结
  • 事件循环(EventLoop) 是 Vert.x 中处理 I/O 事件的核心线程,负责事件分发和非阻塞任务调度。
  • 上下文(Context) 是 Vert.x 中封装和调度异步任务的上下文环境,确保任务在正确的线程中执行。
  • 关系总结
    每个 Verticle 实例绑定到一个 Context,每个 Context 绑定到一个 EventLoop 线程。Context 负责将任务调度到绑定的 EventLoop 线程或 Worker 线程中执行,确保线程亲和性和非阻塞设计。

通过这种设计,Vert.x 实现了高并发、低延迟的异步编程模型,非常适合构建高性能的网络应用。


4. 关键点总结

  • 线程亲和性
    EventLoop 和 Context 共同确保同一 Verticle 的所有事件处理逻辑在同一个线程中执行,避免线程切换的开销和多线程竞争问题。

  • 非阻塞设计
    EventLoop 必须保持非阻塞状态,所有阻塞操作必须通过 Context 提交到 Worker 线程池中执行。

  • 任务隔离
    Context 将任务隔离到不同的线程中执行(EventLoop 线程或 Worker 线程),确保高并发场景下的性能和稳定性。


5. 代码示例

以下是一个简单的 Vert.x 示例,展示了 EventLoop 和 Context 的协作:

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Context;
import io.vertx.core.Vertx;
import io.vertx.core.eventloop.EventLoop;public class ExampleVerticle extends AbstractVerticle {@Overridepublic void start() {// 获取当前 Verticle 的 ContextContext context = vertx.getOrCreateContext();// 获取绑定的 EventLoopEventLoop eventLoop = context.owner();System.out.println("Current thread: " + Thread.currentThread().getName());System.out.println("Is EventLoop thread: " + context.isOnEventLoopThread());// 在 EventLoop 线程中执行任务context.runOnContext(v -> {System.out.println("Running on EventLoop thread: " + Thread.currentThread().getName());});// 执行阻塞操作(通过 Worker 线程)context.executeBlocking(promise -> {// 模拟阻塞操作Thread.sleep(1000);promise.complete("Blocking operation completed");}, res -> {System.out.println("Result: " + res.result());});}public static void main(String[] args) {Vertx vertx = Vertx.vertx();vertx.deployVerticle(new ExampleVerticle());}
}
输出示例:
Current thread: vert.x-eventloop-thread-0
Is EventLoop thread: true
Running on EventLoop thread: vert.x-eventloop-thread-0
Result: Blocking operation completed
  • 解释
    • start() 方法在 EventLoop 线程中执行。
    • context.runOnContext 提交的任务也在同一个 EventLoop 线程中执行。
    • context.executeBlocking 提交的任务在 Worker 线程中执行(输出中未显示 Worker 线程名,但实际是异步的)。

6. 总结

  • EventLoop 是 Vert.x 中处理 I/O 事件的核心线程,负责事件分发和非阻塞任务调度。
  • Context 是 Vert.x 中封装和调度异步任务的上下文环境,确保任务在正确的线程中执行。
  • EventLoop 和 Context 的关系
    每个 Verticle 实例绑定到一个 EventLoop 和一个 Context,Context 负责将任务调度到绑定的 EventLoop 线程或 Worker 线程中执行,确保线程亲和性和非阻塞设计。

通过这种设计,Vert.x 实现了高并发、低延迟的异步编程模型,非常适合构建高性能的网络应用。


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

spring中的@EnableAutoConfiguration注解详解

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


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

相关文章

LTSPICE仿真电路:(三十一)HOWLAND电流源

1.HOWLAND电流源 推导过程:这个运放是正负反馈都存在,但负反馈是大于正反馈的,因正反馈多出一个Rload,所以可以使用虚短续断,运放的U等于U-,负反馈处得出Uout与U-的关系,再利用正相端节点电流算…

LLaMA-Factory - 批量推理(inference)的脚本

scripts/vllm_infer.py 是 LLaMA-Factory 团队用于批量推理(inference)的脚本,基于 vLLM 引擎,支持高效的并行推理。它可以对一个数据集批量生成模型输出,并保存为 JSONL 文件,适合大规模评测和自动化测试。…

引擎下线缺陷检测系统ENAgent

引擎下线缺陷检测系统ENAgent采用信号处理技术以及人工智能技术对引擎生产线下线的各种引擎在生产线上进行缺陷实时检测,通过振动信号、声纹信号等信号融合集成,在线实时判断其是否存在缺陷以及进行故障诊断。ENAgent系统采用全Python语言,以…

【量化交易学习】布林线(BOLL)指标

目录 1. 布林线(BOLL)指标定义与构成1.1 定义1.2 布林线的构成 2. BOLL(布林线)的应用场景3. BOLL指标的研判标准3.1 BOLL指标中的上、中、下轨线的意义3.2 BOLL指标中的上、中、下轨线之间的关系3.3 K线和布林线上、中、下轨之间…

ArcGIS Pro 创建渔网格网过大,只有几个格网的解决方案

之前用ArcGIS Pro创建渔网的时候,发现创建出来格网过大,只有几个格网。 后来查阅资料,发现是坐标不对,导致设置格网大小时单位为度,而不是米,因此需要进行坐标系转换,网上有很多资料讲了ArcGIS …

java27

1.IO流 FileOutPutStream字节输出流基本用法: 一次性写入一个字符串的内容: 注意:\r或者\n表示把普通的r或者n的字符转义成回车的意思,所以不需要\\ FileInputStream字节输入流基本用法 -1在ASCII码里面对应的符号: 不…

Windows设置之RDP文件用户密码

1、远程桌面另存为rdp文件 2、编辑rdp文件&#xff0c;添加用户名密码信息 username:s:<用户名> password 51:b:<加密后的密码> 3、<加密后的密码>通过PowerShell命令或者 ("<密码>" | ConvertTo-SecureString -AsPlainText -Force) | Conve…

day025-网络基础-DNS与ARP协议

文章目录 1. DNS服务1.1 DNS解析流程1.2 查看本地DNS缓存&#xff08;Windows&#xff09;1.3 查看详细DNS解析流程1.4 排查DNS故障 2. 面试题&#xff1a;用户访问网站过程2.1 抓包 3. ARP协议3.1 命令查看3.2 抓包 4. ICMP协议4.1 禁用ping 5. 踩坑记录1. **为什么解析域名时…

SEO长尾关键词优化实战

内容概要 在长尾关键词优化实践中&#xff0c;系统化的策略设计与执行路径直接影响流量获取效率与转化质量。本文从行业竞争度评估切入&#xff0c;通过多维指标拆解目标关键词的流量价值与操作成本&#xff0c;帮助从业者建立科学的资源分配模型&#xff1b;同时聚焦用户搜索…

复杂业务场景下 JSON 规范设计:Map<String,Object>快速开发 与 ResponseEntity精细化控制HTTP 的本质区别与应用场景解析

Moudle 1 Json使用示例 在企业开发中&#xff0c;构造 JSON 格式数据的方式需兼顾 可读性、兼容性、安全性和开发效率&#xff0c;以下是几种常用方式及适用场景&#xff1a; 一、直接使用 Map / 对象转换&#xff08;简单场景&#xff09; 通过 键值对集合&#xff08;如 M…

Oracle正则表达式学习

目录 一、正则表达简介 二、REGEXP_LIKE(x,匹配项) 三、REGEXP_INSTR 四、REGEXP_SUBSTR 五、REGEXP_REPLACE 一、正则表达简介 相关网址&#xff1a; https://cloud.tencent.com/developer/article/1456428 https://www.cnblogs.com/lxl57610/p/8227599.html https://…

【HW系列】—溯源与定位—Windows入侵排查

文章目录 实在不会手动&#xff0c;打开一个杀毒软件&#xff0c;全盘扫描一、入侵排查思路与流程1. 常见应急响应事件分类2. 入侵排查流程图 二、Windows账户安全排查&#xff08;D盾&#xff0c;微步沙箱&#xff09;1. 正常账户 vs 黑客账户区别2. 自动账户排查3. 隐藏账户与…

【机器学习基础】机器学习入门核心:Jaccard相似度 (Jaccard Index) 和 Pearson相似度 (Pearson Correlation)

机器学习入门核心&#xff1a;Jaccard相似度 &#xff08;Jaccard Index&#xff09; 和 Pearson相似度 &#xff08;Pearson Correlation&#xff09; 一、算法逻辑Jaccard相似度 (Jaccard Index)**Pearson相似度 (Pearson Correlation)** 二、算法原理与数学推导1. Jaccard相…

CVE-2021-28164源码分析与漏洞复现

漏洞概述 漏洞名称&#xff1a;Jetty 路径解析逻辑漏洞导致 WEB-INF 敏感信息泄露 漏洞编号&#xff1a;CVE-2021-28164 CVSS 评分&#xff1a;7.5 影响版本&#xff1a;Jetty 9.4.37 - 9.4.38 修复版本&#xff1a;Jetty ≥ 9.4.39 漏洞类型&#xff1a;路径遍历/信息泄露 C…

微软常用运行库合集(VisualC++)2025.04.22

软件下载 【名称】&#xff1a;微软常用运行库合集(Visual C)2024.11.07 【大小】&#xff1a;76 .7MB 【语言】&#xff1a;简体中文 【安装环境】&#xff1a;Win7/Win8/Win10/Win11 【迅雷网盘下载】&#xff1a; 链接&#xff1a;https://pan.xunlei.com/s/VOCJ3CDOT6HEhQN…

CATANet:面向轻量级图像超分辨率的高效内容感知令牌聚合方法

摘要 基于Transformer的方法在图像超分辨率&#xff08;SR&#xff09;等底层视觉任务中展现出了令人印象深刻的性能。然而&#xff0c;其计算复杂度随空间分辨率呈二次方增长。一系列研究试图通过将低分辨率&#xff08;LR&#xff09;图像划分为局部窗口、轴向条纹或膨胀窗口…

十四、【测试执行篇】让测试跑起来:API 接口测试执行器设计与实现 (后端执行逻辑)

[TOC](【测试执行篇】让测试跑起来&#xff1a;API 接口测试执行器设计与实现 (后端执行逻辑)) 前言 测试执行是测试平台的核心价值所在。一个好的测试执行器需要能够&#xff1a; 准确解析测试用例&#xff1a; 正确理解用例中定义的请求参数和断言条件。可靠地发送请求&am…

Linux环境基础开发工具->make/Makefile

引入&#xff1a;make/Makefile是什么&#xff1f; 前面我们知道了vim负责编辑代码&#xff0c;gcc负责编译代码&#xff0c;而make/Makefile则负责的是自动化编译&#xff01; Makefile是一个文件&#xff0c;make是一条指令 我们在Makefile文件中进行编辑&#xff0c;让哪些…

VMware Tools 手动编译安装版

OWASPBWA安装VMware tools 安装时&#xff0c;显示如下提示 官方安装手册参考&#xff1a;https://knowledge.broadcom.com/external/article?legacyId1014294 按照提示&#xff0c;下载linux.iso文件&#xff0c;并连接到虚拟机的CDROM里&#xff0c;状态勾选已连接&#x…

OpenFeign和Gateway集成Sentinel实现服务降级

目录 OpenFeign集成Sentinel实现fallback服务降级cloud-alibaba-payment8003(支付服务)cloud-common-api(通用模块)cloud-alibaba-order9003(订单服务)Sentinel配置流控规则测试结果 Gateway集成Sentinel实现服务降级cloud-gateway9527(网关)测试结果 总结 OpenFeign集成Sentin…