uvloop!让Python asyncio异步编程性能直逼Go协程性能

2022-09-1811:17:53编程语言入门到精通Comments888 views字数 1490阅读模式

思考后端优化的事情,了解到了uvloop,它是python原生asyncio事件循环的替代品。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

先介绍下asyncio

Python从3.4开始,引入了asyncio库,参考PEP-3156。Python从3.5开始,引入了asyncawait语法,参考PEP-0492文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

Python中的用法其实跟javascript中的asyncawait相似,毕竟脚本语言的规范,基本都是抄来抄去,都愿意把隔壁语言的优秀语法吸纳进来。这对开发者也很爽,更容易学另一门语言了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

Python3.4和3.5算是推动了一场革命,自此,Python异步编程越来越火(基于协程)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

也许你不懂协程,我简单介绍下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

以前我们用Python写爬虫,可能会用requests这个库,requests.get(url)发请求,等到有了结果,代码再继续进行下去。它是顺序的同步的执行。当请求发生时,你只能傻傻的等,不能让代码去做另一件事。除非你新开一个线程去做另一件事。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

但是现在,我们有了异步编程。基于内置的事件循环,我们可以达到这样的效果:遇到I/O操作(例如Http请求)时,我们先暂停这段代码(这个任务)的执行,再去看看有没有其它任务可以执行,如果有其它任务可执行,就执行其它任务。如果所有任务都无法执行,就等着,直到有1个任务可执行了,就执行它,直到它运行完毕或者遇到I/O操作,再暂停它,执行其它任务。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

注意,Python中的异步编程,是基于事件循环的。今天,我们要聊的就是事件循环。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

关于uvloop

uvloopPython原生事件循环的替代品。提高了性能。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

为什么提高了性能

(说法来源于uvloop官方博客)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

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

Benchmarks

这不是我做的,我只是转发一下uvloop官方测试结果。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

分为两种测试:TCP协议和HTTP协议。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

TCP

这是用简单的echo服务做的测试,不能代表所有生产环境的情况。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

分别用1KiB数据包、10KiB、100KiB做了测试。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

uvloop!让Python asyncio异步编程性能直逼Go协程性能文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

可以看到uvloop确实牛逼,性能直逼Go。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

HTTP

uvloop!让Python asyncio异步编程性能直逼Go协程性能文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

解释下:官方人员本来想用aiohttp这个Python中最常用的异步http服务库测试的。但是它的http解析器效率太低了,已然成为整个系统的瓶颈,所以他们手动实现了http-parser(起初是为Nginx设计的,所以效率非常高)的Python版本,称之为httptools文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

可以看到,asyncio原生事件循环和uvloop,对aiohttp没有性能提升!(看完后,我想:以后不敢用aiohttp了)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

而把http解析器这个瓶颈解决掉后,asyncio原生事件循环和uvloop性能都明显提升,但uvloop明显更牛逼,在10KiB和100KiB场景下,性能超越了Go。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

uvloop有缺点吗

有,不支持Windows。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

怎么使用uvloop

安装

pip install uvloop

引入

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

其它async代码不变,你就享受到了更快的事件循环!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

感受

如果一味追求性能,还是直接用Go吧。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

但是uvloop确实给Python开发者提供了更强的性能,对于Python开发者很爽。但是也要注意,有没有其它性能瓶颈,例如跟aiohttp结合使用时,瓶颈可能在于http解析。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

作者:HullQin文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

来源:稀土掘金文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/27832.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/27832.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定