你必须要会uvloop!让Python asyncio异步编程性能直逼Go协程性能

Posted HullQin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你必须要会uvloop!让Python asyncio异步编程性能直逼Go协程性能相关的知识,希望对你有一定的参考价值。

背景

最近我在思考后端优化的事情,了解到了uvloop,它是python原生asyncio事件循环的替代品。

先介绍下asyncio

Python从3.4开始,引入了asyncio库,参考PEP-3156。Python从3.5开始,引入了asyncawait语法,参考PEP-0492

Python中的用法其实跟javascript中的asyncawait相似,毕竟脚本语言的规范,基本都是抄来抄去,都愿意把隔壁语言的优秀语法吸纳进来。这对开发者也很爽,更容易学另一门语言了。

Python3.4和3.5算是推动了一场革命,自此,Python异步编程越来越火(基于协程)。

也许你不懂协程,我简单介绍下:

注意,Python中的异步编程,是基于事件循环的。今天,我们要聊的就是事件循环。

关于uvloop

uvloopPython原生事件循环的替代品。提高了性能。

为什么提高了性能

(说法来源于uvloop官方博客)

  1. uvloop是基于Cython写的,执行效率更高。
  2. uvloop底层基于libuv,而libuv是高性能、跨平台的异步IO库,nodejs的事件循环也是基于libuv的。

Benchmarks

这不是我做的,我只是转发一下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。

怎么使用uvloop

安装

pip install uvloop

引入

import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

其它async代码不变,你就享受到了更快的事件循环!

感受

如果一味追求性能,还是直接用Go吧。

但是uvloop确实给Python开发者提供了更强的性能,对于Python开发者很爽。但是也要注意,有没有其它性能瓶颈,例如跟aiohttp结合使用时,瓶颈可能在于http解析。

参考博客:uvloop: Blazing fast Python networking

写在最后

我是HullQin,公众号线下聚会游戏的作者(欢迎关注公众号,发送加微信,交个朋友),转发本文前需获得作者HullQin授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋等游戏,不收费没广告。还独立开发了《合成大西瓜重制版》。还开发了《Dice Crush》参加Game Jam 2022。喜欢可以关注我 HullQin 噢~我有空了会分享做游戏的相关技术。

以上是关于你必须要会uvloop!让Python asyncio异步编程性能直逼Go协程性能的主要内容,如果未能解决你的问题,请参考以下文章

自动化脚本如何切换环境?Pytest这些功能你必须要掌握

python——那些你必须要了解的库

自动化脚本如何切换环境?Pytest这些功能你必须要掌握

精选 15 个顶级 Python 库,你必须要试试

这10个奇妙的Python库,你必须要试试!

你必须要会的生信基础套餐-perl与Linux