EventLoop
介绍
我们先回顾一下,EventLoop就是我们在最开始的示意图中的Selector,每个EventLoop和一个线程绑定,用于处理多个Channel。
任务调度
- 如果我们想实现延时任务的调度,比如连接成功5s之后发送一包数据,就可以用到EventLoop的计划任务
ctx.Channel.EventLoop.Schedule(() => { Console.WriteLine("delay 1s"); }, new TimeSpan(1000)); // 如果需要提前取消,可以调用Cancel方法 IScheduledTask task = ctx.Channel.EventLoop.Schedule(() => { Console.WriteLine("delay 1s"); }, new TimeSpan(1000)); tsak.Cancel();
- 一个任务引发后,会判断当前是否在需要处理这个任务的EventLoop中(程序知道自己目前在执行哪个线程,线程又跟EventLoop对应),如果在就直接执行该任务,如果不在该任务中,则任务入队稍后处理
- 永远不要把一个需要耗费长时间的任务放到EventLoop执行队列来执行,需要使用我们前面介绍的EventExecutor的方法。
Group
许多Channel对应一个EventLoop,但是EventLoop能分配给她的Channel个数是有限的,要处理可以扩展的无数个Channel就需要EventLoopGroup。他们的结构