Python协程asyncio异步编程结合uvloop性能提升

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

扫描二维码关注公众号,回复: 14565483 查看本文章

安装

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

猜你喜欢

转载自blog.csdn.net/u012206617/article/details/128791228