netty组件---EventLoop 和 EventLoopGroup

回想一下我们在 NIO 中是如何处理我们关心的事件的? 在一个 while 循环中 select 出事
件, 然后依次处理每种事件。 我们可以把它称为事件循环, 这就是 EventLoop。 interface
io.netty.channel. EventLoop 定义了 Netty 的核心抽象, 用于处理网络连接的生命周期中所发
生的事件。
io.netty.util.concurrent 包构建在 JDK 的 java.util.concurrent 包上。而 io.netty.channel 包
中的类, 为了与 Channel 的事件进行交互, 扩展了这些接口/类。 一个 EventLoop 将由一个
永远都不会改变的 Thread 驱动, 同时任务(Runnable 或者 Callable) 可以直接提交给
EventLoop 实现, 以立即执行或者调度执行

根据配置和可用核心的不同, 可能会创建多个 EventLoop 实例用以优化资源的使用, 并
且单个 EventLoop 可能会被指派用于服务多个 Channel。
Netty 的 EventLoop 在继承了 ScheduledExecutorService 的同时, 只定义了一个方法,
parent()。在 Netty 4 中, 所有的 I/O 操作和事件都由已经被分配给了 EventLoop 的那个 Thread
来处理。
任务调度
偶尔, 你将需要调度一个任务以便稍后(延迟) 执行或者周期性地执行。 例如, 你可能
想要注册一个在客户端已经连接了 5 分钟之后触发的任务。 一个常见的用例是, 发送心跳
消息到远程节点, 以检查连接是否仍然还活着。 如果没有响应, 你便知道可以关闭该 Channel
了。
线程管理
在内部, 当提交任务到如果(当前) 调用线程正是支撑 EventLoop 的线程, 那么所提交
的代码块将会被(直接) 执行。 否则, EventLoop 将调度该任务以便稍后执行, 并将它放入
到内部队列中。 当 EventLoop 下次处理它的事件时, 它会执行队列中的那些任务/事件。

 

线程的分配
服务于 Channel 的 I/O 和事件的 EventLoop 则包含在 EventLoopGroup 中。
异步传输实现只使用了少量的 EventLoop(以及和它们相关联的 Thread) , 而且在当前
的线程模型中, 它们可能会被多个 Channel 所共享。这使得可以通过尽可能少量的 Thread 来
支撑大量的 Channel, 而不是每个 Channel 分配一个 Thread。 EventLoopGroup 负责为每个
新创建的 Channel 分配一个 EventLoop。 在当前实现中, 使用顺序循环(round-robin) 的方
式进行分配以获取一个均衡的分布, 并且相同的 EventLoop 可能会被分配给多个 Channel。
一旦一个 Channel 被分配给一个 EventLoop, 它将在它的整个生命周期中都使用这个
EventLoop(以及相关联的 Thread) 。 请牢记这一点, 因为它可以使你从担忧你的
ChannelHandler 实现中的线程安全和同步问题中解脱出来。

需要注意, EventLoop 的分配方式对 ThreadLocal 的使用的影响。因为一个 EventLoop 通
常会被用于支撑多个 Channel, 所以对于所有相关联的 Channel 来说, ThreadLocal 都将是
一样的。 这使得它对于实现状态追踪等功能来说是个糟糕的选择。 然而, 在一些无状态的上
下文中, 它仍然可以被用于在多个 Channel 之间共享一些重度的或者代价昂贵的对象, 甚
至是事件。
 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值