HullQin分享后端优化经验:探索uvloop与Python asyncio的深度应用
我是HullQin,公众号线下派对游戏作者(欢迎关注公众号,发送加微信,交友)。转发本文需获得作者HullQin授权。我独立开发了“在线桌游合集”,这是一个可以轻松与朋友在线玩斗地主、五子棋等游戏的网页,免费,无广告。 《Dice Crush》也是为了参加Game Jam 2022而开发的,如果喜欢的话可以在HullQin上关注我哦~有时间我会分享游戏相关的技术。

背景
最近在思考后端优化,了解了uvloop,它是python原生asyncio事件循环的替代品。
首先介绍一下asyncio
从Python 3.4开始,引入了asyncio库,参考PEP-3156。 Python从3.5开始引入了async和await语法,参考PEP-0492。
Python中的用法其实和JavaScript中的async和await类似。毕竟脚本语言的规范基本上都是一遍又一遍地复制,并且愿意融入邻近语言的优秀语法。这对于开发人员来说也很棒,可以更轻松地学习另一种语言。
Python 3.4和3.5推动了一场革命。从那时起,Python异步编程变得越来越流行(基于协程)。
可能你不太了解协程,我简单介绍一下:
以前,当我们使用Python编写爬虫时,我们可能会使用requests库requests.get(url)来发送请求,并等到有结果才继续代码。这是一个顺序且同步的执行。当请求发生时,你只能等待,不能让代码做别的事情。除非你打开一个新线程去做另一件事。
但现在,我们有了异步编程。基于内置的事件循环,我们可以实现如下效果:当遇到I/O操作(比如HTTP请求)时,我们先暂停这段代码(这个任务)的执行,然后看看是否有其他可以执行的任务。如果还有其他任务需要执行,则执行其他任务。如果所有任务都无法执行,则等待一个任务可以执行,然后执行该任务,直到运行完毕或遇到 I/O 操作,然后暂停并执行其他任务。
请注意,Python 中的异步编程基于事件循环。今天我们要讨论的是事件循环。
关于uvloop
uvloop 是 Python 原生事件循环的替代品。提高性能。
为什么性能会提高
(声明来自uvloop官方博客)
uvloop基于Cython编写,执行效率更高。 uvloop底层基于libuv,libuv是一个高性能、跨平台的异步IO库。 Nodejs的事件循环也是基于libuv的。基准测试
这不是我做的,我只是转发uvloop官方的测试结果。
分为TCP协议和HTTP协议两种测试。
传输控制协议
这是使用简单的 echo 服务进行的测试,并不能代表所有生产环境中的情况。
分别使用1KiB、10KiB和100KiB数据包进行测试。
可见uvloop确实牛逼,性能几乎和Go一样好。