发布时间:2022-03-30 09:49:08 人气:186 作者:多测师
1.libevent/libev: Gevent(greenlet+前期libevent,后期libev)使用的网络库,广泛应用;
2.tornado: tornado框架自己实现的IOLOOP;
3.picoev: meinheld(greenlet+picoev)使用的网络库,小巧轻量,相较于libevent在数据结构和事件检测模型上做了改进,所以速度更快。但从github看起来已经年久失修,用的人不多。
4.uvloop: Python3时代的新起之秀。Guido操刀打造了asyncio库,asyncio可以配置可插拔的event loop,但需要满足相关的API要求,uvloop继承自libuv,将一些低层的结构体和函数用Python对象包装。目前Sanic框架基于这个库
5. 协程
EventLoop简化了不同平台上的事件处理,但是处理事件触发时的回调依然很麻烦,响应式的异步程序编写对程序员的心智是一项不小的麻烦。
因此,协程被引入来替代回调以简化问题。协程模型主要在在以下方面优于回调模型:
以近似同步代码的编程模式取代异步回调模式,真实的业务逻辑往往是同步线性推演的,因此,这种同步式的代码写起来更加容易。底层的回调依然是callback hell,但这部分脏活累活已经转交给编译器与解释器去完成,程序员不易出错。
异常处理更加健全,可以复用语言内的错误处理机制,回调方式。而传统异步回调模式需要自己判定成功失败,错误处理行为复杂化。
上下文管理简单化,回调方式代码上下文管理严重依赖闭包,不同的回调函数之间相互耦合,割裂了相同的上下文处理逻辑。协程直接利用代码的执行位置来表示状态,而回调则是维护了一堆数据结构来处理状态。
方便处理并发行为,协程的开销成本很低,每一个协程仅有一个轻巧的用户态栈空间。
6. EventLoop与协程的发展史
04年,event-driven 的 nginx 诞生并快速传播,06年以后从俄语区国家扩散到全球。同时期,EventLoop 变得具象化与多元化,相继在不同的编程语言实现。
近十年以来,后端领域内古老的子例程与事件循环得到结合,协程(协作式子例程)快速发展,并也革新与诞生了一些语言,比如 golang 的 goroutine,luajit 的 coroutine,Python 的 gevent,erlang 的 process,scala 的 actor 等。
就不同语言中面向并发设计的协程实现而言,Scala 与 Erlang 的 Actor 模型、Golang 中的 goroutine 都较 Python 更为成熟,不同的协程使用通信来共享内存,优化了竞态、冲突、不一致性等问题。然而,根本的理念没有区别,都是在用户态通过事件循环驱动实现调度。
由于历史包袱较少,后端语言上的各种异步技术除 Python Twisted 外基本也没有 callback hell 的存在。其他的方案都已经将 callback hell 的过程进行封装,交给库代码、编译器、解释器去解决。
以上内容为大家介绍了Python框架里一般会见到的这几种事件循环,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注多测师。https://www.e70w.com/xwzx/