FastAPI 与异步 Flask 的基准?

Nat*_*les 2 python flask fastapi

我是一名对基准测试不感兴趣的开发人员,我正在尝试决定是否应该使用 Flask 还是 FastAPI 来构建一些 Python/Vue 项目。我在网上看到有关 FastAPI 如何比 Flask 更快的内容,因为 Flask 是单线程或类似的东西,而 FastAPI 是异步的,但显然最近 Flask 添加了异步路由,所以现在我想知道 FastAPI 是否仍然是(?) 比 Flask 更快。

有人做过比较 FastAPI 和 Flask 异步路由的基准测试吗?当我搜索谷歌时我找不到任何东西。

gdl*_*lmx 9

根据Miguel Grinberg 的基准研究,\nFastAPI 可能比异步 Flask 更快或更慢,具体取决于 Web 服务器和 Flask 异步类型。\n一般来说, Greenlet 支持的 WSGI 服务器(Meinheld / Gevent上的 Flask 可以提供与异步 Flask 相当的吞吐量异步优先的 ASGI 框架,例如 FastAPI。\n请注意,Grinberg 正在比较三个部分的整体性能:框架、Web 服务器和 Web 应用程序。

\n

以下是他尝试的三种不同场景下相关框架的吞吐量(数字越高越好):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n
框架网络服务器类型测试 1 吞吐量测试2吞吐量测试3吞吐量
烧瓶迈因霍尔德异步/Greenlet1.435.271.06
烧瓶格文特异步/Greenlet1.224.541.01
快速API独角兽异步/协程1.214.331.02
艾奥弗拉斯独角兽异步/协程1.11--
烧瓶uWSGI同步1.091.011.26
烧瓶鳐鱼同步1.00(基线)1.00(基线)1.00(基线)
\n
\n

* Meinheld是一个用 C 语言编写的 WSGI 服务器。

\n

Grinberg 在他的文章中指出,框架之间的确切相对结果将取决于服务器所承受的特定负载,但他的结论是框架之间没有很大差异:

\n
\n

请记住,不同框架或 Web 服务器之间的性能差异不会非常显着,因此请选择能够提高您工作效率的工具!

\n
\n

更多关于 Flask 的异步方法

\n

Flask 采用不同的异步视图方法。\n在 Grinberg 的基准测试中,实现了三种方法:Aioflask(带有 uvicorn 的标准 python ASGI)、Meinheld 中的 Greenlet 和 Gevent。由于Aioflask测试尚未完全完成,因此仅提供测试1的结果,该结果与Flask文档一致:

\n
\n

由于其实现方式,Flask\xe2\x80\x99s 异步/协程支持的性能低于异步优先框架。

\n
\n

请注意,Greenlet方法需要一种特殊的方式来编写异步操作,而不是标准的 Python 协程。因此,现有的 asyncio 代码库需要使用greenletio等适配器进行修补。\nGevent 严重依赖于对 python 标准库、数据库引擎和其他性能关键库进行适当的猴子修补。

\n

格林伯格在他的博客中多次谈到这一点:

\n
\n

Gevent 测试在我的基准测试中表现相当不错,但在原始基准测试中却表现得非常糟糕。这是因为作者忘记修补 psycopg2 包,使其在 greenlet 下变为非阻塞。

\n
\n