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

网站建设山东公司乐清做网站的

网站建设山东公司,乐清做网站的,个人永久免费自助建站,wordpress 安装出现 过多重定向文章目录 前言类图主要功能NioEventLoop如何实现事件循环NioEventLoop如何处理多路复用Netty如何管理Channel和Selector管理Channel管理Selector注意事项 前言 Netty通过事件循环机制(EventLoop)处理IO事件和异步任务#xff0c;简单来说#xff0c;就是通过一个死循环… 文章目录 前言类图主要功能NioEventLoop如何实现事件循环NioEventLoop如何处理多路复用Netty如何管理Channel和Selector管理Channel管理Selector注意事项 前言 Netty通过事件循环机制(EventLoop)处理IO事件和异步任务简单来说就是通过一个死循环不断处理当前已发生的IO事件和待处理的异步任务。 ① NioEventLoop是一个基于JDK NIO的异步事件循环类它负责处理一个Channel的所有事件在这个Channel的生命周期期间。 ② NioEventLoop的整个生命周期只会依赖于一个单一的线程来完成。一个NioEventLoop可以分配给多个ChannelNioEventLoop通过JDK Selector来实现I/O多路复用以对多个Channel进行管理。 ③ 如果调用Channel操作的线程是EventLoop所关联的线程那么该操作会被立即执行。否则会将该操作封装成任务放入EventLoop的任务队列中。 ④ 所有提交到NioEventLoop的任务都会先放入队列中然后在线程中以有序(FIFO)/连续的方式执行所有提交的任务。 ⑤ NioEventLoop的事件循环主要完成了 已经注册到Selector的Channel的监控并在感兴趣的事件可执行时对其进行处理完成任务队列(taskQueue)中的任务以及对可执行的定时任务和周期性任务的处理(scheduledTaskQueue中的可执行的任务都会先放入taskQueue中后再从taskQueue中依次取出执行)。 类图 主要功能 NioEventLoop 主要负责以下几个方面的功能 事件循环NioEventLoop 是一个单线程的事件循环它不断地轮询注册在其上的 Channel看是否有就绪的 I/O 事件如读、写、连接等然后进行相应的处理。任务执行除了处理 I/O 事件外NioEventLoop 还负责执行定时任务和普通任务。这些任务可以是用户自定义的也可以是 Netty 框架内部的。Channel 的注册与注销Netty 中的 Channel 在创建后需要注册到一个 EventLoop 上这样它才能开始处理 I/O 事件。同样地当 Channel 不再需要时也需要从 EventLoop 上注销。Selector 的管理NioEventLoop 内部使用 Java NIO 的 Selector 来轮询 Channel 的就绪状态。它负责 Selector 的创建、销毁以及选择操作。 在 Netty 中通常会有多个 NioEventLoop 实例它们通常与多线程模型结合使用以实现真正的并发处理。每个 NioEventLoop 负责处理一组 Channel 的 I/O 事件这样可以将不同的 Channel 分布到不同的线程上从而实现并发处理。 总的来说NioEventLoop 是 Netty 中负责处理 I/O 事件和任务执行的核心组件它使得 Netty 能够高效地处理大量的网络连接和 I/O 操作。 NioEventLoop如何实现事件循环 NioEventLoop在Netty中实现事件循环的过程是Netty网络框架的核心机制之一它结合了Java NIO的非阻塞特性和事件驱动模型以高效地处理网络事件。以下是NioEventLoop如何实现事件循环的详细过程 轮询就绪事件 在事件循环中NioEventLoop调用Selector的select()方法来等待Channel上就绪的事件。select()方法会阻塞直到至少有一个Channel的事件就绪或者超时。 处理就绪事件 一旦select()方法返回NioEventLoop会获取就绪的Channel集合并遍历这些Channel。对于每个就绪的ChannelNioEventLoop会根据其感兴趣的事件类型调用相应的处理器通常是ChannelPipeline中的ChannelInboundHandler来处理这些事件。这可能包括读取数据、写入数据、处理连接等。 执行非I/O任务 除了处理I/O事件外NioEventLoop还负责执行提交给它的非I/O任务。这些任务可能包括用户自定义的业务逻辑、回调方法等。NioEventLoop通常有一个任务队列用于存储待执行的任务。在事件循环中它会检查任务队列并依次执行其中的任务。 定时任务调度 NioEventLoop还支持定时任务的调度。用户可以将定时任务提交给NioEventLoop并指定任务的执行时间或执行间隔。NioEventLoop内部会维护一个定时任务列表并根据任务的调度信息在合适的时间点执行这些任务。 通过这个事件循环机制NioEventLoop能够高效地处理大量的网络连接和I/O事件同时保持单线程的事件处理模型简化了并发控制和线程安全的处理。此外Netty还通过多线程模型和多个NioEventLoop实例的配合使用实现了真正的并发处理从而能够处理更大规模的并发连接和事件。 Overrideprotected void run() {int selectCnt 0;// 必须使用死循环不断进行事件轮询获取任务和通道的 IO 事件for (;;) {try {int strategy;try {/*** 返回处理策略就分为两种* 有任务 hasTasks() true就不能等待IO事件了先直接调用 selectNow() 方法* 获取当前准备好IO 的通道channel 的数量(0 表示一个都没有)处理 IO 事件 和任务。** 没有任务 hasTasks() false返回 SelectStrategy.SELECT (是负数)* 没有要及时处理的任务先阻塞等待 IO 事件*/strategy selectStrategy.calculateStrategy(selectNowSupplier, hasTasks());switch (strategy) {case SelectStrategy.CONTINUE:continue;case SelectStrategy.BUSY_WAIT:// fall-through to SELECT since the busy-wait is not supported with NIOcase SelectStrategy.SELECT:// 返回下一个计划任务准备运行的截止时间纳秒值long curDeadlineNanos nextScheduledTaskDeadlineNanos();if (curDeadlineNanos -1L) {// 返回 -1说明没有下一个计划任务// 将 curDeadlineNanos 设置为 NONE// 调用 selector.select 方法时就没有超时// 要无限等待了除非被唤醒或者有准备好的 IO 事件。curDeadlineNanos NONE;}// 设置 超时等待时间nextWakeupNanos.set(curDeadlineNanos);try {if (!hasTasks()) {// 当前没有任务那么就通过 selector 查看有没有 IO 事件// 并设置超时时间超时时间到了那么就要执行计划任务了// 如果 curDeadlineNanos 是 NONE就没有超时无限等待。strategy select(curDeadlineNanos);}} finally {// 这个更新只是为了帮助阻止不必要的选择器唤醒// 所以使用lazySet是可以的(没有竞争条件)nextWakeupNanos.lazySet(AWAKE);}// fall throughdefault:}} catch (IOException e) {// 如果我们在这里接收到IOException那是因为Selector搞错了。// 让我们重新构建选择器并重试。// https://github.com/netty/netty/issues/8566rebuildSelector0();selectCnt 0;handleLoopException(e);continue;}/*** 代码走到这里* 要么有 IO 事件即 strategy 0* 要么就是有任务要运行。* 如果两个都不是那么就有可能是 JDK 的 epoll 的空轮询 BUG*/selectCnt;cancelledKeys 0;needsToSelectAgain false;final int ioRatio this.ioRatio;boolean ranTasks;if (ioRatio 100) {// 如果 ioRatiotry {if (strategy 0) {processSelectedKeys();}} finally {// 确保运行了所有待执行任务包括当前时间已经过期的计划任务ranTasks runAllTasks();}} else if (strategy 0) {// strategy 0 说明有 IO 事件// 那么需要调用 processSelectedKeys() 方法执行 IO 时间final long ioStartTime System.nanoTime();try {processSelectedKeys();} finally {// 计算 IO 操作花费的时间final long ioTime System.nanoTime() - ioStartTime;// 按照比例计算可以运行任务的超时时间 ioTime * (100 - ioRatio) / ioRatio// 超时时间到了即使还有任务没有运行也直接返回了等下一个周期在运行这些任务ranTasks runAllTasks(ioTime * (100 - ioRatio) / ioRatio);}} else {// strategy 0 说明没有 IO 事件不用处理 IO 了// 调用 runAllTasks(0) 方法超时时间为0这将运行最小数量的任务ranTasks runAllTasks(0);}if (ranTasks || strategy 0) {// 要么有任务运行要么有 IO 事件处理if (selectCnt MIN_PREMATURE_SELECTOR_RETURNS logger.isDebugEnabled()) {logger.debug(Selector.select() returned prematurely {} times in a row for Selector {}.,selectCnt - 1, selector);}selectCnt 0;} else if (unexpectedSelectorWakeup(selectCnt)) {// 即没有任务运行也没有IO 事件处理就有可能是 JDK 的 epoll 的空轮询 BUG// 调用 unexpectedSelectorWakeup(selectCnt) 方法处理。// 可能会重新建立 SelectselectCnt 0;}} catch (CancelledKeyException e) {// Harmless exception - log anywayif (logger.isDebugEnabled()) {logger.debug(CancelledKeyException.class.getSimpleName() raised by a Selector {} - JDK bug?,selector, e);}} catch (Error e) {throw e;} catch (Throwable t) {handleLoopException(t);} finally {// Always handle shutdown even if the loop processing threw an exception.try {if (isShuttingDown()) {// 如果事件轮询器开始 shutdown就要关闭 IO 资源closeAll();if (confirmShutdown()) {return;}}} catch (Error e) {throw e;} catch (Throwable t) {handleLoopException(t);}}}}NioEventLoop如何处理多路复用 NioEventLoop 在 Netty 中处理多路复用的方式主要是基于 Java NIO 的非阻塞特性和选择器Selector机制。多路复用允许单个线程同时处理多个通道Channel的 I/O 事件从而提高了系统的吞吐量和响应速度。 以下是 NioEventLoop 如何处理多路复用的具体步骤 初始化与注册 NioEventLoop 在初始化时创建一个 Selector 对象用于监控多个 Channel 的状态。当一个 Channel 需要处理 I/O 事件时它会被注册到 NioEventLoop 的 Selector 上并指定感兴趣的事件类型如读、写等。 轮询就绪事件 NioEventLoop 进入事件循环调用 Selector 的 select() 方法等待通道上就绪的事件。select() 方法会阻塞直到至少有一个 Channel 的事件就绪或者超时。 处理就绪事件 当 select() 方法返回时NioEventLoop 获取就绪的 Channel 集合。对于每个就绪的 ChannelNioEventLoop 根据其感兴趣的事件类型调用相应的处理器如 ChannelInboundHandler来处理这些事件。 多路复用核心 Selector 的核心作用在于它能够同时监控多个 Channel并且只选择那些处于就绪状态的 Channel 进行处理。通过这种方式NioEventLoop 可以使用单个线程高效地处理大量并发的 Channel而无需为每个 Channel 创建一个独立的线程。 异步非阻塞通信 由于 Netty 采用了异步通信模式NioEventLoop 中的 IO 操作如读、写都是非阻塞的。这意味着当一个 IO 操作不能立即完成时例如等待数据从网络读取线程不会被阻塞而是可以继续处理其他任务或事件。 任务调度与执行 除了处理 I/O 事件外NioEventLoop 还负责执行提交给它的任务如定时任务、用户自定义任务等。这些任务与 I/O 事件一起在 NioEventLoop 的事件循环中得到调度和执行。 Netty如何管理Channel和Selector 管理Channel 注册Channel 当一个新的连接建立时Netty会创建一个新的Channel实例例如NioSocketChannel或NioServerSocketChannel并将其注册到NioEventLoop中的Selector上。注册过程包括将Channel添加到Selector的监控列表中并设置其感兴趣的事件类型如读、写、连接等。 事件处理 一旦Selector检测到某个Channel上有事件就绪例如数据可读或可写它会通知NioEventLoop。然后NioEventLoop会调用相应的ChannelPipeline和ChannelHandler来处理这些事件。 关闭Channel 当连接关闭时Netty会注销Channel并从Selector的监控列表中移除它。同时相关的资源也会被释放。 管理Selector 创建Selector 在NioEventLoop初始化时它会创建一个Selector实例。这个Selector用于监控所有注册到该NioEventLoop的Channel。 轮询就绪事件 NioEventLoop在事件循环中不断调用Selector的select()方法来等待Channel上的事件就绪。一旦有事件就绪Selector会返回这些事件的集合。 处理就绪事件 NioEventLoop遍历Selector返回的就绪事件集合并为每个事件调用相应的处理器。这通常涉及到调用ChannelPipeline中的ChannelHandler来处理这些事件。 优化Selector的使用 Netty可能会使用多个Selector和NioEventLoop实例来优化性能特别是在处理大量并发连接时。通过分散负载到多个线程和Selector上Netty能够充分利用多核CPU的资源提高吞吐量。 注意事项 通常情况下你不需要直接管理Selector。Netty的NioEventLoop和Channel抽象为你提供了高级的API来处理I/O事件和连接。在编写自定义的ChannelHandler时你需要关注如何处理事件而不是如何管理Channel或Selector。如果你需要执行定时任务或自定义的后台任务可以使用NioEventLoop的任务队列来提交这些任务。这些任务会在事件循环的适当时候得到执行。
http://www.zqtcl.cn/news/290067/

相关文章:

  • php网站留言板怎么做wordpress 相关文章推荐
  • 怎么看网站被惩罚专业的网站建设流程
  • 如何制作手机免费网站模板下载用户体验设计师是什么
  • php网站建设基本流程基于php网站开发设计
  • 建设一个网站需要哪些软硬件条件无做弊的棋牌游戏网站
  • 最有设计感的网站扬中网站建设 优帮云
  • 企业建设银行网站登录不了wordpress需要ftp
  • 广州营销型网站建设团队专业建设内涵包括哪些内容
  • 网站如何做响应式布局外国网站上做Task
  • 知乎网站建设入门书大渡口集团网站建设
  • 免费网站建设是什么宁波网站建设的价格表
  • 网站设计导航栏高度网站设计的经营范围
  • 帮别人建设网站多少利润北京网站建设公司华网制作作
  • 微信网站需要备案吗瑞安商业网站建设
  • 做网站如何计算工资wordpress stheme
  • 网站建设销售人才简历wordpress 搜索tag
  • 设计网站专业云南旅行社网站开发
  • 小规模开普票网站建设几个点张浦专业做网站
  • 点击图片跳转到网站怎么做链接网址后缀名大全
  • php网站开发优化crm客户系统
  • 韩国网站免费模板wordpress数据库名称
  • 如何修改网站发布时间贵阳网站建设报价
  • 东莞网站推广培训免费云电脑
  • 湖北网站建设详细方案脑叶公司手机版下载
  • 淄博网站制作平台形象怎样建设旅游网站
  • 广州花都网站建设网站改版协议
  • 中国建设协会网站首页工信部网站备案被删除
  • 丹阳网站建设案例dedecms 购物网站
  • 网站上怎么做动画广告视频下载seo黑帽是什么意思
  • 服装网站建设网综合社区网站开发费用