Ostep 33 Event Based Concurrency

这章详细描述了之前20年看netty源码时就了解过的一个概念:eventloopNetty以及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发挥的场景,它就是为此而生的。

版权声明:除特殊说明,博客文章均为intotw原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇