For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
【Netty4 中的I/O和事件处理】
I/O操作触发一个事件,该事件流经含有一个或多个ChannelHandlers实例的ChannelPipeline。传播这些事件的方法调用能被ChannelHandler拦截,并根据需要处理事件。
一个事件的本质通常决定了它该被如何处理;它可能转换数据从网络栈到你的应用中,或执行相反操作,或执行完全不同的操作。但事件处理逻辑必须是通用的并且足够灵活去处理所有情况。因此,在Netty4中所有I/O操作和事件处理都在EventLoop所在的线程上执行。
这与Netty3是不同的。
【Netty3 中的I/O操作】
在早前的版本的线程模式中,仅保证所有的入站事件会在I/O线程(相当于Netty 4 中的EventLoop)上执行。所有的出站事件将通过调用线程来处理,该线程可能是I/O线程也可能是其他线程。起初这看似是一个好主意,但是很快这被认为是会有问题的,因为我们需要小心出站事件在ChannelHandler的同步性 ( 比如,你再不同的线程中同时调用了同一个Channel的Channel.write()方法。因此出站的ChannelHandler可以被多个线程同时方法,这就存在了同步性问题 )。总而言之,多个线程不会尝试同时访问一个出站事件,这是无法保证的。这是可能发生的,比如,你再不同的线程中同时调用了同一个Channel的Channel.write()方法,以此触发了相同的下游事件。
【使用EventLoop的定时任务】
ScheduledExecutorService的实现是有限制性的,比如额外的线程被创建作为池管理的一部分。如果许多任务被积极安排,这可能会遇到瓶颈。
使用JDK的定时任务线程池ScheduledExecutorService的局限性包括:
① 在IO线程中聚合了一个独立的定时任务线程池,这样在处理过程中会存在线程上下文切换问题,这就打破了Netty的串行化设计理念;
② 存在多线程并发操作问题,因为定时任务Task和IO线程NioEventLoop可能同时访问并修改同一份数据;
③ JDK的ScheduledExecutorService从性能角度看,存在性能优化空间。
免责声明:本文由昆明达内小编转载自网络,旨在分享提供阅读,版权归原作者所有,如有侵权请联系我们进行删除。
0元课程试听报名开始啦!