epoll与selector的简单理解

Posted jihuabai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了epoll与selector的简单理解相关的知识,希望对你有一定的参考价值。

概念理解

selector与epoll是多路复用的函数。我认为多路复用是针对bio而言,指的是通过单线程来追踪管理多个socket对象。传统的bio中,在socket的accept与read两个阶段都会造成阻塞,那么就无法处理并发问题,即仅一个socket对象就已经占用了IO对象,没有余力解决其他线程的请求。那么如何让bio能够处理并发问题呢?就是在accept和read阶段不再阻塞,当accept到socket对象的时候就将其缓存至list中,同时如果read到数据了就处理数据。但如果没有accept对象,则会去list中询问以前accept的对象有没有需要read的数据。如此,通过一个线程完成了多个socket对象的管理。那么selector与epoll就是完成了上述功能。

对比分析

selector内部维持了一个数据结构(bitmap),用来存储已经接受的socket对象。然后将此数据复制一份,交给内核去轮训每个socket对象是否有期待的事件发生,如果有就会进行置位(用户态到内核态的复制)。然后返回给用户态,由用户态完成事件的处理。

 

epoll针对selector进行了优化,采用红黑树来存储accept的socket对象,同时还维持着一个list,存放有发生的事件的socket以及事件,然后将此任务队列返回。用户态无需遍历所有的socket对象。下图即为epoll的说明图。

技术图片

 

以上是关于epoll与selector的简单理解的主要内容,如果未能解决你的问题,请参考以下文章

IO多路复用_selectors模块_python

selectors

3.5.4 Selectors(epoll)

selectors

selecter模块默认使用epoll 实现IO多路复用,展示单线程的并发效果

Day15 - Python基础15 模块学习-selectors