Vert.x学习笔记-什么是Worker线程池

article/2025/7/25 22:20:26

Vert.x学习笔记

      • 一、Worker线程池的作用
      • 二、Worker线程池的特点
      • 三、Worker线程池的使用
      • 四、Worker线程池的配置与调优
      • 五、Worker线程池的工作原理
        • 1. 任务分类与线程隔离
        • 2. Worker线程池的启动与配置
        • 3. 任务提交与执行流程
        • 4. 线程安全与上下文切换
        • 5. 性能优化与监控
        • 6. 关键特性总结
        • 总结
      • 六、Worker线程池与EventLoop的关系
        • 1. Event Loop线程
        • 2. Worker线程池
        • 3. Worker线程池与Event Loop的关系
          • (1) 协作机制
          • (2) 任务委托
          • (3) 性能优化
        • 4. 案例说明
          • 场景:HTTP请求处理数据库查询
        • 5. 总结
        • 6. 最佳实践


在Vert.x中,Worker线程池是用于执行阻塞任务的线程池,它是Vert.x线程模型的重要组成部分,

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

一、Worker线程池的作用

  • 处理阻塞任务:Worker线程池用于执行可能阻塞Event Loop线程的任务,例如数据库查询、文件I/O、长时间计算等。通过将这些任务委托给Worker线程池,可以避免阻塞Event Loop线程,确保Event Loop线程能够专注于处理非阻塞的IO事件和事件循环。
  • 提高并发性能:通过Worker线程池,Vert.x可以充分利用多核处理器的优势,提高应用程序的并发处理能力。Worker线程池中的线程可以并行执行阻塞任务,从而加快任务的处理速度。

二、Worker线程池的特点

  • 线程隔离:Worker线程池与Event Loop线程池严格隔离,确保Event Loop线程专注于非阻塞任务的高效处理。这种隔离可以防止阻塞任务影响Event Loop线程的正常运行,提高系统的稳定性和可靠性。
  • 线程复用:Worker线程池中的线程可以被复用,用于执行多个阻塞任务。这减少了线程创建和销毁的开销,提高了系统的性能。
  • 配置灵活:可以通过配置文件或代码来调整Worker线程池的大小,以适应不同的应用场景和负载需求。

三、Worker线程池的使用

  • Worker Verticle:可以将Verticle部署为Worker Verticle,使其运行在Worker线程池中。Worker Verticle专为调用阻塞代码而设计,不会阻塞任何Event Loop线程。可以通过DeploymentOptions.setWorker(true)来将Verticle部署为Worker Verticle。
  • executeBlocking方法:对于非Verticle的代码,可以使用vertx.executeBlocking方法将阻塞任务委托给Worker线程池执行。该方法接受一个Handler,Handler中的代码将在Worker线程池中的线程上执行。执行完成后,可以通过另一个Handler来处理结果或错误。

四、Worker线程池的配置与调优

  • 线程池大小:Worker线程池的大小可以根据应用场景和负载需求进行调整。过小的线程池大小可能导致任务排队等待执行,影响系统的性能;过大的线程池大小则可能导致线程竞争和资源浪费。
  • 线程执行时间监控:可以通过setMaxWorkerExecuteTime等方法来设置Worker线程的最大执行时间,并对超时任务进行监控和处理。这有助于防止长时间运行的阻塞任务影响系统的性能。
  • 任务队列管理:Worker线程池通常使用任务队列来管理待执行的任务。可以根据任务的特点和负载需求选择合适的任务队列类型,例如有界队列、无界队列等。

五、Worker线程池的工作原理

在Vert.x中,Worker线程池的核心作用是隔离并高效执行可能阻塞Event Loop线程的任务,其工作原理可拆解为以下关键环节:


1. 任务分类与线程隔离
  • Event Loop线程
    • 专用于处理非阻塞任务(如HTTP请求解析、定时器触发)。
    • 通过事件循环(Event Loop)实现高并发,但严格禁止阻塞操作。
  • Worker线程池
    • 专用于处理阻塞任务(如数据库查询、文件I/O、长时间计算)。
    • 通过独立的线程池避免阻塞Event Loop线程,确保系统整体响应性。

类比

  • Event Loop线程类似餐厅的“前台服务员”,快速响应顾客(事件)的即时需求。
  • Worker线程池类似餐厅的“后厨厨师”,处理耗时较长的烹饪任务(阻塞操作),避免阻塞前台服务。

2. Worker线程池的启动与配置
  • 默认配置
    • Vert.x默认创建20个Worker线程(可通过VertxOptions.setWorkerPoolSize()调整)。
  • 线程复用
    • Worker线程池中的线程可被多个任务复用,减少线程创建/销毁的开销。
  • 动态扩展
    • 线程池大小可根据负载动态调整(需结合应用场景优化)。

3. 任务提交与执行流程
  • 任务提交方式

    1. executeBlocking方法
      • 将阻塞任务封装为Handler,提交到Worker线程池执行。
      • 示例:
        vertx.executeBlocking(future -> {// 阻塞操作(如数据库查询)String result = blockingDatabaseQuery();future.complete(result);
        }, res -> {System.out.println("Result: " + res.result());
        });
        
    2. Worker Verticle
      • 将Verticle部署为Worker Verticle(DeploymentOptions.setWorker(true)),使其所有逻辑运行在Worker线程池中。
  • 执行流程

    1. 任务入队:提交的任务被放入Worker线程池的任务队列。
    2. 线程分配:空闲的Worker线程从队列中取出任务并执行。
    3. 结果回调:任务完成后,通过回调Handler将结果返回给Event Loop线程(或直接处理)。

4. 线程安全与上下文切换
  • 线程安全
    • Worker线程池中的任务是线程安全的,因为每个任务由独立的线程执行。
    • 但需注意共享数据的同步(如使用vertx.sharedData()或外部同步机制)。
  • 上下文切换
    • Worker线程与Event Loop线程通过回调或消息传递结果,避免直接共享状态。
    • Vert.x内部管理上下文切换,开发者无需手动干预。

5. 性能优化与监控
  • 线程池大小调优
    • CPU密集型任务:线程数可接近CPU核心数(避免线程竞争)。
    • IO密集型任务:线程数可适当增大(如50-100),以隐藏I/O等待时间。
  • 任务队列监控
    • 监控任务队列长度,避免任务堆积导致延迟。
  • 超时处理
    • 通过setMaxWorkerExecuteTime()设置任务最大执行时间,防止长时间阻塞。

6. 关键特性总结
特性说明
线程隔离Worker线程与Event Loop线程严格隔离,避免阻塞。
任务复用Worker线程可被多个任务复用,减少开销。
动态扩展线程池大小可根据负载动态调整。
回调机制任务完成后通过回调Handler返回结果,避免阻塞Event Loop线程。
线程安全每个任务由独立线程执行,但需注意共享数据的同步。

总结

Worker线程池通过任务分类、线程隔离、动态复用等机制,实现了阻塞任务的高效执行,同时确保Event Loop线程的非阻塞运行。其核心设计理念是:

  1. 将耗时任务委托给Worker线程池,避免阻塞Event Loop线程。
  2. 通过回调或消息传递结果,实现线程间的安全协作。
  3. 通过配置优化线程池大小,适应不同负载场景。

通过合理使用Worker线程池,可以显著提升Vert.x应用的并发性能和稳定性。


六、Worker线程池与EventLoop的关系


1. Event Loop线程
  • 核心职责
    • 处理非阻塞的I/O操作(如网络请求、定时器等)。
    • 执行轻量级的任务,确保快速响应事件。
  • 特点
    • Vert.x为每个核心创建一个Event Loop线程(默认情况下,一个CPU核心对应一个Event Loop线程)。
    • Event Loop线程是单线程的,同一时间只能处理一个任务,通过事件循环(Event Loop)实现高并发。
    • 严格避免阻塞操作,否则会阻塞整个Event Loop线程,影响其他任务的执行。

2. Worker线程池
  • 核心职责
    • 处理可能阻塞的任务(如数据库查询、文件I/O、长时间计算等)。
    • 确保阻塞任务不会影响Event Loop线程的正常运行。
  • 特点
    • Worker线程池是线程池,可以包含多个线程(默认大小为20,可通过配置调整)。
    • Worker线程可以执行阻塞操作,因为它们不参与Event Loop线程的事件循环。
    • 通过executeBlocking方法或Worker Verticle将任务委托给Worker线程池执行。

3. Worker线程池与Event Loop的关系
(1) 协作机制
  • 任务分离
    • Event Loop线程处理非阻塞任务,快速响应事件。
    • Worker线程池处理阻塞任务,避免阻塞Event Loop线程。
  • 线程隔离
    • Event Loop线程和Worker线程严格隔离,确保Event Loop线程的高效运行。
    • Worker线程池中的线程可以并行执行阻塞任务,提高并发性能。
(2) 任务委托
  • executeBlocking方法
    • 通过vertx.executeBlocking将阻塞任务委托给Worker线程池执行。
    • 任务执行完成后,可以通过回调Handler处理结果。
    vertx.executeBlocking(future -> {// 阻塞操作(如数据库查询)String result = blockingOperation();future.complete(result);
    }, res -> {System.out.println("Result: " + res.result());
    });
    
  • Worker Verticle
    • 将Verticle部署为Worker Verticle,使其运行在Worker线程池中。
    • Worker Verticle专为调用阻塞代码而设计,不会阻塞任何Event Loop线程。
    DeploymentOptions options = new DeploymentOptions().setWorker(true);
    vertx.deployVerticle(new MyWorkerVerticle(), options);
    
(3) 性能优化
  • 线程池大小调整
    • 根据应用场景和负载需求,调整Worker线程池的大小。
    • 过小的线程池大小可能导致任务排队等待执行,影响系统的性能。
    • 过大的线程池大小则可能导致线程竞争和资源浪费。
  • 任务队列管理
    • Worker线程池通常使用任务队列来管理待执行的任务。
    • 可以根据任务的特点和负载需求选择合适的任务队列类型(如有界队列、无界队列等)。

4. 案例说明
场景:HTTP请求处理数据库查询
  • Event Loop线程
    • 接收HTTP请求,解析请求参数。
    • 将数据库查询任务委托给Worker线程池执行。
  • Worker线程池
    • 执行数据库查询(阻塞操作)。
    • 查询完成后,将结果通过回调或消息传递回Event Loop线程。
  • Event Loop线程
    • 接收Worker线程池返回的结果,构造HTTP响应。
    • 将响应发送回客户端。

5. 总结
  • Event Loop线程
    • 专注于非阻塞任务,确保快速响应事件。
    • 严格避免阻塞操作,保持高效运行。
  • Worker线程池
    • 处理阻塞任务,避免阻塞Event Loop线程。
    • 通过线程池和任务队列实现高并发处理。
  • 协作关系
    • Event Loop线程和Worker线程池通过任务委托和回调机制协作。
    • 任务分离和线程隔离确保系统的高性能和稳定性。

6. 最佳实践
  • 避免在Event Loop线程中执行阻塞操作
    • 始终将阻塞任务委托给Worker线程池或Worker Verticle执行。
  • 合理配置Worker线程池大小
    • 根据应用场景和负载需求调整线程池大小。
  • 使用AsyncResult处理异步操作
    • 通过AsyncResult处理异步操作的成功或失败,确保代码的健壮性。

通过理解Worker线程池与Event Loop的关系,可以更好地设计Vert.x应用程序,实现高效的事件驱动和异步编程。


在这里插入图片描述

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

spring中的@EnableAutoConfiguration注解详解

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


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

相关文章

Smith圆图知识学习笔记

Smith圆图知识学习笔记 理论背景 图 1 Smith图表是由菲利普史密斯(Phillip Smith)于1939年发明的,如图1所示,当时他在美国的RCA公司工作。史密斯曾说过,“在我能够使用计算尺的时候,我对以图表方式来表达数学上的关联很有兴趣”。 史密斯图表的基本在于以下的算式: 图 …

MySQL 8.0 OCP 英文题库解析(十一)

Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题91~100 试题91…

RT-Thread Studio学习(十八)ADC+TIM+DMA

RT-Thread Studio学习(十八)ADCTIMDMA 一、简介二、新建RT-Thread项目并使用外部时钟三、启用ADC四、修改代码五、测试 一、简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下使用ADC设备。硬件及开发环境如下: OS WIN…

ES分词搜索

ES的使用 前言作者使用的版本作者需求 简介ES简略介绍ik分词器简介 使用es的直接简单使用es的查询 es在java中使用备注说明 前言 作者使用的版本 es: 7.17.27spring-boot-starter-data-elasticsearch: 7.14.2 作者需求 作者接到一个业务需求,我们系统有份数据被…

Drawio编辑器二次开发

‌ Drawio (现更名为 Diagrams.net )‌是一款完全免费的在线图表绘制工具,由 JGraph公司 开发。它支持创建多种类型的图表,包括流程图、组织结构图、UML图、网络拓扑图、思维导图等,适用于商务演示、软件设计等多种场景…

破解高原运维难题:分布式光伏智能监控系统的应用研究

安科瑞刘鸿鹏 摘要 高原地区光照资源丰富,具有发展分布式光伏发电的巨大潜力。然而,该地区复杂的气候环境、地形地貌和运维条件对光伏电站的运行与维护带来严峻挑战。本文结合Acrel1000DP分布式光伏监控系统的技术特点和典型应用案例,探讨其…

Golang|分布式搜索引擎中所使用到的设计模式

迭代器模式 定义:在遍历接口时,提供统一的方法函数供调用,保持一致性。核心思想:与大众习惯保持一致,方便第三方实现容器类时保持一致。常见方法:如next()方法,适用于所有集合类,简化…

招工招聘系统开发——适配多元场景,满足企业多样化招聘需求

不同的企业有不同的招聘需求,不同的岗位也有不同的招聘特点。我们的招工招聘系统开发,充分考虑了企业的多样化需求,适配多元场景,为企业提供全方位的招聘解决方案。 对于大型企业来说,招聘规模大、岗位种类多、招聘流…

优化版本,增加3D 视觉 查看前面的记录

上图先 运来的超出发表上限,重新发。。。 #11:06:57Current_POS_is: X:77Y:471Z:0U:-2 C:\Log\V55.txt import time import tkinter as tk from tkinter import messagebox from PIL import Image, ImageTk import socket import threading from date…

《TCP/IP 详解 卷1:协议》第2章:Internet 地址结构

基本的IP地址结构 分类寻址 早期Internet采用分类地址(Classful Addressing),将IPv4地址划分为五类: A类和B类网络号通常浪费太多主机号,而C类网络号不能为很多站点提供足够的主机号。 子网寻址 子网(Su…

JNI开发流程

一. 引言 最近在做一个自己的项目,就是基于FastDDS封装一套JAVA库,让android和java应用可以使用dds的功能。 由于FastDDS是使用C编写的开源库,因此java的类库想要调用FastDDS的接口,需要额外编写一个JNI层的动态库对FastDDS的接口…

powershell 中 invoke-expression 报错解决

打开powershell就出现这个报错: 网上搜了也没有很好的解决办法,抱着一点点期待,问了豆包 根据豆包的指示,在终端执行以下 几个命令,报错解决了(开心万岁) # 移除多余的引号和空路径 $pathArra…

交错推理强化学习方法提升医疗大语言模型推理能力的深度分析

核心概念解析 交错推理:灵活多变的思考方式 交错推理(Interleaved Reasoning)是一种在解决复杂问题时,不严格遵循单一、线性推理路径,而是交替、灵活应用多种推理策略的方法。这种思维方式与人类专家在处理复杂医疗问题时的思考模式更为接近,表现为一种动态、适应性强的…

【下载ECharts最简单的方法】

最简单下载ECharts的方法 对于简单项目,我们需要的echarts文件是echarts.min.js,以下是下载ECharts的最简单方法: 方法一:直接下载(推荐初学者) 访问ECharts官网:https://echarts.apache.org…

西藏建筑安全员 B 证考试中常见的 单选题及解析

西藏建筑安全员 B 证考试中常见单选题及解析,涵盖安全生产管理、法律法规、安全技术等核心考点,结合西藏地区建筑施工特点整理,帮助理解考试重点: 一、安全生产管理基础 1. 安全管理原则与制度 1、建筑施工安全管理的方针是&am…

案例分享--血管支架的径向力分布评估--DIC数字图像相关技术用于生物医学-高置信度DIC测量

医疗设备制造商有责任创造和确保高效且安全的产品,以守护人类的健康。EchoBio LLC公司的Kenneth Perry博士是植入式医疗设备实验验证行业的领导者和专家。Perry博士的一项研究任务是评估用于疏通血管阻塞的编织自膨胀支架的径向力分布。Perry博士特别需要关注径向力…

[Javascript进阶]JSON.stringify与JSON.parse详解

JSON.stringfy JSON.stringify 的核心作用是: 👉 将 JS 的对象、数组、基本类型转换为合法的 JSON 字符串。 手撕实现时,要考虑以下几个方面: 基本类型处理: string → 加上双引号,注意转义;nu…

VirtualBox给Rock Linux9.x配置网络

写这篇文章之前,先说明一下,我参考的是我之前写的《VirtualBox Linux网络配置》 我从CentOS7转到了Rock9,和配置Centos7一样,主流程没有变化,变化的是Rock9.x中的配置文件和使用的命令。 我再说一次,因为主…

逆向分析基础总结

一、了解计算机部件 CPU: 中央处理器。有三个重要的部件: 逻辑部件:负责算数运算,包括定点运算、浮点运算等。 寄存器部件:负责临时数据存储,一个CPU包含多个寄存器。 控制部件:负责发出指令所…

企业信息化集成方案:聚水潭·奇门数据对接金蝶云星空

聚水潭奇门数据集成到金蝶云星空:销售退货单更新方案 在企业信息化管理中,数据的高效流动和准确对接是实现业务流程自动化的关键。本文将分享一个实际案例,展示如何通过轻易云数据集成平台,将聚水潭奇门系统中的销售退货数据无缝…