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

Netty框架自带类DefaultEventExecutorGroup的作用,用来做业务的并发

一、DefaultEventExecutorGroup的用途

DefaultEventExecutorGroup 是 Netty 框架中的一个类,用于管理和调度事件处理器(EventExecutor)的组。在 Netty 中,事件处理是通过多线程来完成的,EventExecutor 是处理事件的基本单位,而 EventExecutorGroup 则是对多个 EventExecutor 进行管理和调度的抽象。

具体来说,DefaultEventExecutorGroup 具有以下主要用途:

  1. 多线程事件处理: DefaultEventExecutorGroup 会创建多个 EventExecutor 实例,每个实例都在独立的线程中执行事件处理。这有助于提高并发性能,允许多个事件可以并行地在不同线程中处理。

  2. 任务调度: 除了处理事件,EventExecutor 还可以用于执行定时任务和异步任务。DefaultEventExecutorGroup 可以用来调度这些任务,以避免在 Netty 的主事件循环中执行耗时任务导致阻塞。

  3. 避免阻塞主事件循环: 如果一个事件处理器的执行时间较长,可能会影响 Netty 的主事件循环的性能。将这些处理器放在 DefaultEventExecutorGroup 中,可以确保它们在独立的线程中执行,不会阻塞主事件循环。

  4. 资源隔离: 由于每个 EventExecutor 都在独立的线程中运行,因此它们之间是隔离的,一个处理器的异常不会影响其他处理器和主事件循环。

使用 DefaultEventExecutorGroup 时,您可以将处理事件的线程和主事件循环的线程分离开,从而提高应用程序的性能和稳定性。但是需要注意的是,创建多个线程可能会带来一些额外的开销和管理成本,需要根据具体情况进行权衡和优化。

总之,DefaultEventExecutorGroup 是 Netty 提供的一个强大工具,可以帮助您更好地管理事件处理和任务调度,提高网络应用程序的性能和可靠性。

二、使用示例

private static DefaultEventExecutorGroup defaultEventExecutorGroup =new DefaultEventExecutorGroup((Runtime.getRuntime().availableProcessors() * 2));// NettyServerHandler-业务处理类
pipeline.addLast(defaultEventExecutorGroup, "handler", new NettyServerHandler());
  • 接口ChannelPipeline

我们这里使用的是第二个方法

    ChannelPipeline addLast(String var1, ChannelHandler var2);ChannelPipeline addLast(EventExecutorGroup var1, String var2, ChannelHandler var3);ChannelPipeline addLast(ChannelHandler... var1);ChannelPipeline addLast(EventExecutorGroup var1, ChannelHandler... var2);
  • addLast实现,见类io.netty.channel.DefaultChannelPipeline
    在这里插入图片描述
    可以看到,它是异步执行的,将work线程和I/O线程隔离开来。

从代码newCtx = this.newContext(group, this.filterName(name, handler), handler);继续往后看线程池EventExecutor。

在这里插入图片描述

三、DefaultEventExecutor.java

  • 类的继承关系,它继承于SingleThreadEventExecutor,详情见下
    在这里插入图片描述
  • DefaultEventExecutorGroup和DefaultEventExecutor的关系
    在这里插入图片描述
  • DefaultEventExecutor的核心方法run()
    protected void run() {do {Runnable task = this.takeTask();if (task != null) {task.run();this.updateLastExecutionTime();}} while(!this.confirmShutdown());}
  • 关键类io.netty.util.concurrent.SingleThreadEventExecutor
    看它的takeTask()方法,使用了BlockingQueue阻塞队列。
protected Runnable takeTask() {assert this.inEventLoop();if (!(this.taskQueue instanceof BlockingQueue)) {throw new UnsupportedOperationException();} else {BlockingQueue taskQueue = (BlockingQueue)this.taskQueue;Runnable task;do {ScheduledFutureTask<?> scheduledTask = this.peekScheduledTask();if (scheduledTask == null) {Runnable task = null;try {task = (Runnable)taskQueue.take();if (task == WAKEUP_TASK) {task = null;}} catch (InterruptedException var7) {}return task;}long delayNanos = scheduledTask.delayNanos();task = null;if (delayNanos > 0L) {try {task = (Runnable)taskQueue.poll(delayNanos, TimeUnit.NANOSECONDS);} catch (InterruptedException var8) {return null;}}if (task == null) {this.fetchFromScheduledTaskQueue();task = (Runnable)taskQueue.poll();}} while(task == null);return task;}}

四、总结

在将io线程和工作线程隔离的时候,建议你直接使用netty自带的并发类,而无需自己去定义业务线程池。因为它完全可胜任异步的需求。

相关文章:

Netty框架自带类DefaultEventExecutorGroup的作用,用来做业务的并发

一、DefaultEventExecutorGroup的用途 DefaultEventExecutorGroup 是 Netty 框架中的一个类&#xff0c;用于管理和调度事件处理器&#xff08;EventExecutor&#xff09;的组。在 Netty 中&#xff0c;事件处理是通过多线程来完成的&#xff0c;EventExecutor 是处理事件的基…...

TCP的四次挥手与TCP状态转换

文章目录 四次挥手场景步骤TCP状态转换 四次挥手场景 TCP客户端与服务器断开连接的时候&#xff0c;在程序中使用close()函数&#xff0c;会使用TCP协议四次挥手。 客户端和服务端都可以主动发起。 因TCP连接时候是双向的&#xff0c;所以断开的时候也是双向的。 步骤 三次…...

【网络编程】实现一个简单多线程版本TCP服务器(附源码)

TCP多线程 &#x1f335;预备知识&#x1f384; Accept函数&#x1f332;字节序转换函数&#x1f333;listen函数 &#x1f334;代码&#x1f331;Log.hpp&#x1f33f;Makefile☘️TCPClient.cc&#x1f340;TCPServer.cc&#x1f38d; util.hpp &#x1f335;预备知识 &…...

centos离线部署docker

有些内部环境需要离线部署&#xff0c;以下做一些备忘。 环境&#xff1a;centos7.9 准备文件&#xff1a; docker-20.10.9.tgz&#xff0c;下载地址 https://download.docker.com/linux/static/stable/x86_64/docker.service&#xff0c;内容见下文daemon.json&#xff0c;内…...

ffmpeg使用滤镜对视频进行处理播放

一、前言 在现代的多媒体处理中,视频和音频滤镜起着至关重要的作用。可以帮助开发者对视频和音频进行各种处理,如色彩校正、尺寸调整、去噪、特效添加等。而FFmpeg作为一个功能强大的开源多媒体框架,提供了丰富的滤镜库,使我们能够轻松地对多媒体文件进行处理和转换。 本…...

Ansible Handlers模块详解,深入理解Ansible Handlers 自动化中的关键组件

深入理解Ansible Handlers 自动化中的关键组件 在现代的IT环境中&#xff0c;自动化已经成为提高效率和减少错误的关键。Ansible作为一款流行的自动化工具&#xff0c;通过使用Playbooks来定义和执行任务。而Handlers作为Ansible的组件之一&#xff0c;在自动化过程中发挥着重要…...

threejs点击模型实现模型边缘高亮的选中效果--更改后提高帧率

先来个效果图 之前写的那个稍微有点问题&#xff0c;帧率只有30&#xff0c;参照官方代码修改后&#xff0c;帧率可以达到50了&#xff0c;在不全屏的状态下&#xff0c;帧率60 1.首先需要导入库 // 用于模型边缘高亮 import { EffectComposer } from "three/examples/js…...

RocketMQ 主备自动切换模式部署

目录 主备自动切换模式部署 Controller 部署​ Controller 嵌入 NameServer 部署​ Controller 独立部署​ Broker 部署​ 兼容性​ 升级注意事项​ 主备自动切换模式部署 该文档主要介绍如何部署支持自动主从切换的 RocketMQ 集群&#xff0c;其架构如上图所示&#xff…...

【MySQL】select相关

文章目录 迭代器distinct 关键字limit offset 关键字order by 列名 asc\descselect语句的执行顺序几点注意 迭代器 指向第一个元素 使用hasNext()进行判断后才进行取元素 resultSet&#xff1a;指向第一个元素前一个 distinct 关键字 去除一列中的重复元素 可以进行多行的去重…...

在Python中应用RSA算法实现图像加密:基于Jupyter环境的详细步骤和示例代码

一、引言 在当今的数字化社会中,信息安全问题备受关注。随着数字图像在生活中的应用越来越广泛,图像的安全性和隐私性也成为人们关心的焦点。如何在网络上安全地传输和存储图像已经成为一项重要的挑战。RSA(Rivest-Shamir-Adleman)算法作为一种被广泛应用的公钥密码体系,…...

Prometheus Blackbox Exporter 的 HTTP 探测指标中各个阶段的时间统计信息

在 Prometheus Blackbox Exporter 的 HTTP 探测指标中&#xff0c;probe_http_duration_seconds 指标包含各个阶段的时间统计信息。这些阶段代表了 HTTP 探测的不同阶段和指标。以下是各个阶段的含义&#xff1a; phase"dns_lookup"&#xff1a;这是指进行 DNS 查找…...

数据结构之时间复杂度-空间复杂度

大家好&#xff0c;我是深鱼~ 目录 1.数据结构前言 1.1什么是数据结构 1.2什么是算法 1.3数据结构和算法的重要性 1.4如何学好数据结构和算法 2.算法的效率 3.时间复杂度 3.1时间复杂度的概念 3.2大O的渐进表示法 【实例1】&#xff1a;双重循环的时间复杂度&#xf…...

新一代构建工具 maven-mvnd

新一代构建工具 maven-mvnd mvnd的前世今生下载安装 mvndIDEA集成 mvnd的前世今生 maven 作为一代经典的构建工具&#xff0c;流行了很多年&#xff0c;知道现在依然是大部分Java项目的构建工具的首选&#xff1b;但随着项目复杂度提高&#xff0c;代码量及依赖库的增多使得ma…...

构建Docker容器监控系统(2)(Cadvisor +Prometheus+Grafana)

Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息&#xff0c;并以图表的形式向用户展示。 接着上一篇来继续 部署Cadvisor 被监控主机上部署Cadvisor容器…...

Leetcode.995 K 连续位的最小翻转次数

题目链接 Leetcode.995 K 连续位的最小翻转次数 rating : 1835 题目描述 给定一个二进制数组 n u m s nums nums 和一个整数 k k k 。 k k k位翻转 就是从 n u m s nums nums 中选择一个长度为 k k k 的 子数组 &#xff0c;同时把子数组中的每一个 0 0 0 都改成 1 1 1 …...

PHP8的跳转语句-PHP8知识详解

如果循环条件满足的时候&#xff0c;则程序会一直执行下去。如果需要强制跳出循环&#xff0c;则需要使用跳转语句来完成。PHP8的跳转语句包括break语句、continue语句和goto语句。 1、break语句 break语句的作用是完全终止循环&#xff0c;包括while、do…while、for、switch…...

Idea中maven无法下载源码

今天在解决问题的时候想要下载源码&#xff0c;突然发现idea无法下载&#xff0c;这是真的蛋疼&#xff0c;没办法查看原因&#xff0c;最后发现问题的原因居然是因为Maven&#xff0c;由于我使用的idea的内置的Bundle3的Maven&#xff0c;之前没有研究过本地安装和内置的区别&…...

【linux-keepalive】keepalive避免单点故障,高可用配置

keepalive: [rootproxy ~]# yum install -y keepalived [rootproxy ~]# vim /etc/keepalived/keepalived.conf global_defs {router_id proxy1 //设置路由ID号vrrp_iptables //不添加任何防火墙规则 } vrrp_instance V…...

测试网络模型的FLOPs和params

概念 FLOPS&#xff1a;注意全大写&#xff0c;是floating point operations per second的缩写&#xff0c;意指每秒浮点运算次数&#xff0c;理解为计算速度。是一个衡量硬件性能的指标。 FLOPs&#xff1a;注意s小写&#xff0c;是floating point operations的缩写&#xf…...

《树莓派项目实战》第十五节 使用L298N驱动板模块驱动双极42步进电机

目录 15.1 双极步进电机引脚介绍 15.2 连接到树莓派 15.3 编写代码驱动步进电机 在本节,我们将学习如何使用L298N驱动板驱动一个双极42步进电机。该项目涉及到的材料有: 树莓派...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...