asyncio介绍
- 和我们以前常用的gevent模块相似,asyncio模块也是在Python中实现协程的模块
- 区别是gevent是第三方库,通过greenlet实现协程,遇到I/O自动切换(自动挡)
- asyncio是Python 3.4版本引入的标准库,asycio 需要自己在代码中让出CPU,控制权在自己手上(手动挡)
- asyncio是原生协程关键字:Async和Await,它们的底层基于生成器函数
uvloop介绍
- uvloop 是python圈子里近两年被抄的相当火热的高性能框架,uvloop是个高性能的异步非阻塞框架,他是完整的asyncio事件循环的替代品,建立在libuv基础之上,由Cython编写而成。Uvloop最终目的使得Asyncio更加快速。
- 根据我个人的测试结果分析uvloop性能确实要比gevent要高,但是易用性没有gevent来的舒服。python sanic也是基于uvloop实现的异步io,但总的来说uvloop的相关资料、实例都有些欠缺。
测试结论
这不是我做的,我只是转发一下uvloop官方测试结果。
分为两种测试:TCP协议和HTTP协议。
TCP
这是用简单的echo服务做的测试,不能代表所有生产环境的情况。
分别用1KiB数据包、10KiB、100KiB做了测试。
可以看到uvloop确实牛逼,性能直逼Go。
HTTP
解释下:官方人员本来想用aiohttp
这个Python中最常用的异步http服务库测试的。但是它的http解析器效率太低了,已然成为整个系统的瓶颈,所以他们手动实现了http-parser
(起初是为Nginx设计的,所以效率非常高)的Python版本,称之为httptools
。
可以看到,asyncio原生事件循环和uvloop,对aiohttp没有性能提升!(看完后,我想:以后不敢用aiohttp了)
而把http解析器这个瓶颈解决掉后,asyncio原生事件循环和uvloop性能都明显提升,但uvloop明显更牛逼,在10KiB和100KiB场景下,性能超越了Go。
uvloop缺点
暂不支持Windows
安装
pip3 install uvloop
使用方法
import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
loop = asyncio.get_event_loop()
...
其它async代码不变,你就享受到了更快的事件循环!
个人总结
如果一味追求性能,还是直接用Go吧。
但是uvloop确实给Python开发者提供了更强的性能,对于Python开发者很爽。但是也要注意,有没有其它性能瓶颈,例如跟aiohttp结合使用时,瓶颈可能在于http解析。
官方参考文献
uvloop: Blazing fast Python networking — magicstack