这章详细描述了之前20年看netty源码时就了解过的一个概念:eventloop,Netty以及Eventloop
eventloop实际上是一个并发模型,基于事件驱动,用于实现在单线程或者单进程上的并发执行(是的,单线程也可以并发执行,没想到吧。
redis,node.js,浏览器,都大量使用到了这个并发模型。它的代码可能如下:
while (1) {
events = getEvents();
for (e in events)
processEvent(e);
}
Event loop的优缺点
优点
- Event loop基于单线程实现,可以很自然的达到既并发,又不需要考虑并发问题
- 能提升CPU利用率,因为在Event Loop优点可以发挥时,就可以使用更少的线程完成更多的I/O任务,减少上下文切换
缺点
- 实现上是有一定复杂度的,所有方法或者说函数,都需要封装成event
- 只在所有event基本都是异步或者小任务的情况下,具备优点
- 如果必须有同步I/O,那整个event都会hang在那个同步I/O上阻塞等待
- 如果有大任务,同样的这个大任务会基本直接阻塞整个event轮转
- 与操作系统页的设计难以配合,操作系统缺页等操作是会触发隐式中断的,依旧会影响执行性能
- 异步I/O磁盘依旧难以实现
- 实现上是有一定复杂度的,所有方法或者说函数,都需要封装成event
- 单线程使用还好,多线程都使用各自的eventloop时,并发问题依旧可能存在
- 上下文管理困难,event之间如果需要上下文(共享变量),那么需要自己实现
NIO
nio部分的内容之前写过了,还是比较详细的,可以看之前的
总结
综合Event Loop的优缺点,我们会发现它最适合做的事,其实是作为大量NIO和AIO管理的Handler,即作为一个总体的handler去处理大量的NIO以及AIO请求(无论接受请求还是发起请求,即作为一个代理)。这才是最适合Event Loop发挥的场景,它就是为此而生的。