Epoll与异步非阻塞

本文探讨了Epoll在异步非阻塞编程中的作用,通过对比Tornado、Redis的实现,解释了Epoll如何实现非阻塞,但并非异步。Tornado通过封装Epoll,提供了一种异步编程模型。文中还提到了Epoll相对于select的优点,如避免轮询和无文件描述符数量限制,同时也指出了编程复杂性和回调逻辑的挑战。
摘要由CSDN通过智能技术生成

    走出大学印象最深刻的就是异步的编程模型,还记得第一次见到奇怪的Epoll时的惊喜和兴奋,然后读了Tornado、Nginx、Redis等源码之后恍然大悟。本文主要以Tornado中的实现说明,所以主要使用Python代码,会加Redis的实现做对比,所以也会有部分的C代码,后期会加上Nginx的实现做对比。

  • 异步和非阻塞的区别

    首先说明两者不是一个层次的东西,非阻塞是对于socket而言,而异步是相对于应用程序而言,是一种编程模型,网上的很多文章对此解释不清,甚至混为一谈。

    Epoll是非阻塞的,但不是异步的。实现非阻塞很简单,只要一句socket.setblocking(False)就够了。实现异步却很复杂,在《UNIX网络编程》中给出的5中I/O模型,只有最后一种是异步模型,其他的都是非异步的。

    Linux没有实现异步IO(效率并不高),Epoll是一种I/O多路复用技术,用户程序需要主动的去询问内核是否有事件发生,而不是事件发生时内核主动的去调用回调函数,所以不是异步的。而Tornado等框架之所以声称是异步的,是框架在epoll的基础上进行了一层封装,由框架去取事件,然后由框架去调用用户的回调函数,所以对于基于框架的用户程序来说,是异步的。

    阻塞模式下,内核收到I/O事件会唤醒处理者,而在非阻塞模式下,会将I/O事件放到其他对象(select,epoll)中甚至忽略。

      Tornado使用Epoll实现了异步的编程模型࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值