简介
Python通过关键字yield提供了对协程的基本支持,但是不完全,所以后来有了 greenlet 、gevent 、asyncio
asyncio(python内置)
Python 3.4版本引入的标准库,直接内置了对异步IO的支持,python内置,使用广泛
需要自己在代码中让出CPU,控制权在自己手上
asyncio的编程模型是一个消息循环。从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。
greenlet
属于 用户态轻量级协程(微线程),基于 C 实现,是 Python 协程早期方案。
手动调度:本身 没有自动 IO 切换能力。你需要手动调用切换方法,主动交出执行权;遇到阻塞 IO 不会自动切换。
特点:仅仅提供协程切换原语,极简、底层,不封装网络 IO。
局限:原生不识别阻塞调用,普通 socket、sleep 会卡住整个程序。
gevent
基于 greenlet 封装的异步 IO 框架(第三方库)
核心:在 greenlet 之上实现猴子补丁 (monkey patch)。
原理:通过补丁替换 Python 标准库阻塞 IO(socket、time.sleep 等),当发生网络 / IO 阻塞时,自动触发 greenlet 切换,实现并发。
调度:自动调度,开发者几乎不用关心协程切换;写同步风格代码,获得异步并发效果。
生态:第三方库,不是 Python 标准库。
关系:gevent = greenlet + IO 自动调度 + 猴子补丁