python协程库:greenlet、gevent、asyncio

简介

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 自动调度 + 猴子补丁


原文出处:/show_1EF5Up8Mto4F.html