博客
关于我
Netty源码—3.Reactor线程模型四
阅读量:790 次
发布时间:2023-02-15

本文共 2375 字,大约阅读时间需要 7 分钟。

NioEventLoop和Reactor线程模型深度解析

5. NioEventLoop的执行总体框架

NioEventLoop是Netty中核心的异步事件循环框架,主要负责处理网络IO事件和异步任务。其执行流程分为三个主要阶段:事件检测、事件处理和任务执行。

6. Reactor线程执行一次事件轮询

Reactor线程通过NioEventLoop的run()方法每进行一次事件轮询,首先会调用select()方法尝试检测出IO事件。然后,processSelectedKeys()方法会处理发现的IO事件,主要包括新连接接入事件和连接数据读写事件。最后,runAllTasks()方法会执行任务队列中的异步任务,包括普通任务和定时任务。

7. Reactor线程处理产生IO事件的Channel

每个Channel都绑定一个唯一的NioEventLoop。Reactor线程通过Channel处理IO事件时,会触发相应的读写事件,并将这些事件处理结果传递给Channel的上下文。

8. Reactor线程处理任务队列之添加任务

Reactor线程中的任务队列分为两种类型:普通任务队列(MpscQueue)和定时任务队列(PriorityQueue)。普通任务通过addTask()方法添加到MpscQueue中,而定时任务则通过schedule()方法添加到PriorityQueue中。

(1)Reactor线程执行一次事件轮询的过程

Reactor线程执行事件轮询时,首先检测是否有新的IO事件发生。如果有,则立即停止事件检测,开始处理这些事件。事件处理完成后,Reactor线程会执行任务队列中的异步任务。

(2)任务的分类和添加说明

任务分为普通任务和定时任务。普通任务通过execute()方法添加到MpscQueue中,而定时任务则通过schedule()方法添加到PriorityQueue中。普通任务和定时任务的添加均通过相应的队列实现,确保线程安全和高效执行。

(3)普通任务的添加

普通任务的添加通常通过execute()方法实现。无论是内部线程还是外部线程调用NioEventLoop的execute()方法,都会将任务添加到对应的MpscQueue中。Netty通过MpscQueue实现了异步任务的聚集和批量执行。

(4)定时任务的添加

定时任务的添加通过schedule()方法实现。该方法会将定时任务添加到PriorityQueue中,并根据截止时间进行排列。PriorityQueue的特性确保了定时任务按截止时间优先执行。

(5)Netty的定时任务机制补充

定时任务在Netty中有三种执行方式:一次性任务(schedule()),固定频率任务(scheduleAtFixedRate())和固定延迟任务(scheduleWithFixedDelay())。每种方式都通过调整任务的截止时间来实现定时执行,确保任务按时处理。

9. Reactor线程处理任务队列之执行任务

Reactor线程执行任务时,首先会将定时任务转移到MpscQueue中,然后逐个执行任务。执行过程中,每隔64个任务会检查一次截止时间,避免长时间阻塞。Netty通过这种方式实现了高效的任务执行和性能优化。

(1)runAllTasks()方法需要传入超时时间

runAllTasks()方法需要传入超时时间参数,确保在指定时间内完成任务执行。这种机制避免了长时间运行任务对IO事件检测的影响。

(2)Reactor线程执行任务的步骤
  • 任务聚合:将定时任务转移到MpscQueue中。
  • 时间计算:计算本轮任务执行的截止时间,填充所有已到期的定时任务。
  • 任务执行:逐个执行任务,并每隔64次任务执行检查截止时间。
  • (3)Netty性能优化之批量策略

    Netty采用每隔64个任务检查截止时间的批量策略,避免频繁的时间计算对性能的影响。这种方式在高负载场景下显著提升了执行效率。

    (4)NioEventLoop.run()方法执行任务总结

    NioEventLoop执行任务时,首先处理IO事件,然后执行异步任务。普通任务和定时任务均存储在MpscQueue中,定时任务在转移后按截止时间排列。Netty通过这种方式确保了任务执行的高效性和高可靠性。

    10. NioEventLoop总结

    (1)NioEventLoop的执行流程总结

    NioEventLoop的执行流程包括:

  • 事件检测:通过select()方法检测IO事件。
  • 事件处理:处理发现的IO事件。
  • 任务执行:执行异步任务,包括普通任务和定时任务。
  • (2)Reactor线程模型总结

    Reactor线程模型具有以下特点:

  • 懒启动:NioEventLoopGroup创建时默认懒启动,bossNioEventLoop在服务启动时启动,workerNioEventLoop在新连接接入时启动。
  • 线程绑定:每个连接绑定一个NioEventLoop,确保线程安全。
  • 任务处理:统一处理网络IO事件和异步任务,提升线程模型的简洁性。
  • (3)NioEventLoop创建启动执行的总结
  • 群组创建:用户创建NioEventLoopGroup时,默认创建两倍CPU核数个NioEventLoop。
  • 线程选择器:NioEventLoopGroup内部有线程选择器优化线程分配。
  • 任务队列:每个NioEventLoop创建一个MpscQueue和一个Selector,确保高效执行和线程安全。
  • 通过对NioEventLoop和Reactor线程模型的深入理解,可以看出其在Netty中的重要作用。NioEventLoop不仅处理网络IO事件,还统一管理异步任务执行,确保高效、线程安全的网络通信。

    转载地址:http://dvcfk.baihongyu.com/

    你可能感兴趣的文章
    natapp搭建外网服务器
    查看>>
    NativePHP:使用PHP构建跨平台桌面应用的新框架
    查看>>
    Nat、端口映射、内网穿透有什么区别?
    查看>>
    Nat、端口映射、内网穿透有什么区别?
    查看>>
    nat打洞原理和实现
    查看>>
    NAT技术
    查看>>
    NAT模式/路由模式/全路由模式 (转)
    查看>>
    NAT模式下虚拟机centOs和主机ping不通解决方法
    查看>>
    NAT的两种模式SNAT和DNAT,到底有啥区别?
    查看>>
    NAT的全然分析及其UDP穿透的全然解决方式
    查看>>
    NAT类型与NAT模型详解
    查看>>
    NAT网络地址转换配置实战
    查看>>
    NAT网络地址转换配置详解
    查看>>
    navbar navbar-inverse 导航条设置颜色
    查看>>
    Navicat for MySQL 命令列 执行SQL语句 历史日志
    查看>>
    Navicat for MySQL 查看BLOB字段内容
    查看>>
    Navicat for MySQL(Ubuntu)过期解决方法
    查看>>
    Navicat Premium 12 卸载和注册表的删除
    查看>>
    Navicat 导入sql文件
    查看>>
    navicat 添加外键1215错误
    查看>>