当前位置: 首页 > Web前端 > HTML5

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

时间:2023-04-04 23:12:37 HTML5

你一定知道uvloop!让Pythonasyncio的异步编程性能接近HullQin授权的Go协程的性能。我独立开发了《联机桌游合集》,这是一个网页,在这里你可以轻松地和朋友一起玩网络游戏,五子棋等游戏,不收费,也没有广告。还为GameJam2022开发了《Dice Crush》,喜欢的话可以关注我HullQin哦~有空我会分享制作游戏的相关技术。背景最近在思考后端优化,了解到uvloop,它是python原生asyncioeventloop的替代品。首先介绍asyncioPython从3.4开始引入了asyncio库,参考PEP-3156。从3.5开始,Python引入了async和await语法,参考PEP-0492。Python中的用法其实和javascript中的async和await类似。毕竟脚本语言的规范基本都是抄来抄去的,愿意吸收隔壁语言的优秀语法。这对开发人员来说也很酷,可以更轻松地学习另一种语言。Python3.4和3.5也算是推动了一场革命。从那时起,Python异步编程变得越来越流行(基于协程)。可能你对协程不了解,我简单介绍一下:以前我们用Python写爬虫的时候,可能会使用requests库,requests.get(url)发送请求,等到有结果之后再进行代码继续。它是顺序和同步执行。当请求发生时,你只能傻傻地等待,不能让代码去做别的事情。除非你打开一个新的线程来做另一件事。但是现在,我们有了异步编程。基于内置的事件循环,我们可以实现这样的效果:当遇到I/O操作(比如Http请求),我们先暂停这段代码(这个任务)的执行,然后再去看看有没有其他的可以执行的任务。如果还有其他任务要执行,请执行其他任务。如果所有的任务都执行不了,就等到有一个任务可以执行的时候再执行,直到运行完或者遇到I/O操作,再挂起执行其他任务。请注意,Python中的异步编程是基于事件循环的。今天,我们要聊的是事件循环。关于uvloopuvloop是Python的本机事件循环的替代品。改进的性能。为什么性能提升(说法来自uvloop官博)uvloop是基于Cython编写的,执行效率更高。uvloop底层是基于libuv的,而libuv是一个高性能、跨平台的异步IO库,nodejs的事件循环也是基于libuv的。Benchmarks不是我做的,我只是转发uvloop的官方测试结果。分为两个测试:TCP协议和HTTP协议。TCP这是使用简单回显服务完成的测试,不能代表所有生产环境。分别用1KiB、10KiB、100KiB数据包测试。可见uvloop确实牛逼,性能接近Go。HTTP解释:官方本来是想用Python中最常用的异步http服务库aiohttp来测试的。但是它的http解析器效率太低,已经成为整个系统的瓶颈,所以他们手工实现了python版的http-parser(本来是为Nginx设计的,所以效率很高),叫做httptools。可以看出asyncio原生的eventloop和uvloop对aiohttp没有性能提升!(看完之后觉得:以后不敢再用aiohttp了。)解决了http解析器的瓶颈后,asyncio的nativeeventloop和uvloop的性能都有明显的提升,但是uvloop明显更强大,在10KiB和100KiB场景,性能超越Go。uvloop有什么缺点吗?是的,它不支持Windows。如何使用uvloop安装pipinstalluvloopimportimportasyncioimportuvloopasyncio.set_event_loop_policy(uvloop.EventLoopPolicy())其他异步代码保持不变,你可以享受更快的事件循环!我觉得如果一味追求性能,还是直接用Go吧。但是uvloop确实为Python开发者提供了更强的性能,这对于Python开发者来说是非常爽的。但也要注意是否存在其他性能瓶颈。例如,与aiohttp结合使用时,瓶颈可能在于http解析。参考博客:uvloop:BlazingfastPythonnetworking写在最后。我是公众号线下派对游戏的作者HullQin(欢迎关注公众号,发送加微信,交朋友)。转发本文需征得作者HullQin授权。我独立开发了《联机桌游合集》,这是一个网页,在这里你可以轻松地和朋友一起玩网络游戏,五子棋等游戏,不收费,也没有广告。还为GameJam2022开发了《Dice Crush》。喜欢的话可以关注我HullQin哦~有空我会分享制作游戏的相关技术。