2024 年了,是 Gevent 还是选择 asyncio Part 1?

2024 年了,是 Gevent 还是选择 asyncio Part 1?

💡 原文中文,约6900字,阅读约需17分钟。
📝

内容提要

这篇文章主要比较了Django、Flask、FastAPI和Starlette四个框架在Web应用中的性能。通过在Azure上进行压力测试,发现在空转情况下,asyncio的性能要优于Gevent,但在ORM + MySQL Driver的情况下,Gevent的生态要好于asyncio的生态。作者期待下一轮测试结果,看在ORM + PGSQL的情况下会有怎样的结论。

🔎

延伸解读

测试环境与负载设计

文章使用 Azure D8as_v5 机器(8核32G)分别部署 Django、Flask、FastAPI 和 Starlette,压测工具为 locust,并混合了多种机型以弥补配额不足。数据库为 16核64G 的 MySQL 实例,随机写入 100 万条数据,通过 SQL 查询模拟生产吞吐。这种设计贴近真实场景,但需注意压测机与目标机分离,且网络延迟可能影响结果。

空转与真实查询的性能差异

空转测试中,Starlette 和 FastAPI 等 asyncio 框架性能优于 Flask+Gevent,asyncio 配合 uvloop 有 10%-20% 的提升。但在包含 ORM 和 MySQL 驱动的实际查询中,Flask+Gevent 反而领先,Starlette 次之,FastAPI 垫底。这说明异步优势在无阻塞时明显,一旦涉及数据库驱动等同步生态,Gevent 的成熟度可能抵消部分性能优势。

生态成熟度对框架选择的影响

文章指出,在 ORM + MySQL Driver 场景下,Gevent 的生态支持更好,而 asyncio 的异步驱动可能不够完善,导致 FastAPI 和 Starlette 性能未达预期。Django 因同步架构性能最差。因此,技术选型不能只看空转基准,需评估实际依赖的数据库驱动和 ORM 是否对异步有良好支持。

后续测试的期待与局限

作者期待下一轮测试 ORM + PGSQL 的组合,以观察生态变化是否影响结论。当前测试仅覆盖 MySQL,且压测机配置混合,可能引入噪声。读者应注意,性能结果受具体版本、驱动实现和部署方式影响,实际选型应结合自身技术栈和负载特征进行验证。

❓

Q&A

在Web框架中,asyncio和Gevent的性能比较如何?

在空转情况下,asyncio的性能优于Gevent,但在ORM + MySQL Driver的情况下,Gevent的生态更好。

测试中使用了哪些Web框架?

测试中使用了Django、Flask、FastAPI和Starlette四个框架。

测试的机器配置是什么?

测试使用了Azure上的D8as_v5机器,配置为8Core32G。

在ORM + MySQL Driver的情况下,哪个框架表现最好?

在ORM + MySQL Driver的情况下,Gevent的生态表现最好。

测试结果显示哪个框架性能最差?

测试结果显示Django的性能最差。

文章中提到的下一步测试计划是什么?

作者期待下一轮测试结果,看看在ORM + PGSQL的情况下会有怎样的结论。

🏷️

标签

➡️

继续阅读