559 字
3 分钟
Ostep 33 Event Based Concurrency

这章详细描述了之前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发挥的场景,它就是为此而生的。
Ostep 33 Event Based Concurrency
https://www.intotw.cn/posts/ostep-33-event-based-concurrency/分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 803 天
部分内容可能已过时