fastapi python 并发_如何评价最近爆红的FastAPI?

答:未来可期、事在人为

从前景考虑,fastapi是python web的未来。但它的发展同时也受制于python web的发展,如果python web在未来式微,fastapi是难以力挽狂澜的。

注:1月17日更新了CBV实现

注:12月4日更新了简单的性能测试

1.性能提升

注: 以下针对生产环境的大型项目而言

fastapi利用异步和轻量级的特点,大大提升了性能。但异步应用到实际中,并不是一件容易的事。fastapi的异步不算难写,逻辑不复杂的话,闭着眼睛加几个await很简单。但如果涉及到复杂系统。一处异步,处处异步。到底要不要用可能就见仁见智了。

轻量级同时也代表着和flask一样,很多东西需要自己diy。而不是像django一样一站式解决。所以fastapi可能逐渐接过flask的位置,但还是难以对django发起挑战。

最重要的一点还是,选了python作为后端。可能打一开始就不是对性能有多敏感。而是看中python的开发效率和生态。如果从兼顾开发效率+性能的角度出发,那么fastapi极大程度上会遇到来自go的强力竞争。只有再兼顾上python现有生态,fastapi才会有很大的优势。

我们可以假想一个现有python项目,遇到了性能瓶颈,但不想脱离python的环境,或者不想承受更换语言的成本。那么fastapi是个很好的未来。

2. API文档、类型检测以及依赖注入

fastapi完全拥抱了typing类型系统,高度整合了openapi(swagger ui),正如他的名字一样fastapi,从api开发的角度来说,无论是性能还是开发效率,它都足够“fast”。为api文档提供了非常多的支持。无需任何配置,后端只要把endpoint写出来,一份详尽的api文档就会自动生成。对于小型项目来说绝对是巨大优势。

类型检测和依赖注入是api文档的基石 ,它们重点在于围绕框架的“感知力”。inspect抓endpoint的参数,明确的知道每个api接口需要什么,返回什么。这会让你感觉这个框架真的很有灵性。对于这方面我个人绝对是赞不绝口的。

3. 简单与简洁

会用flask就会fastapi,fastapi的学习曲线十分平滑。从下至上有很多值得学习参透的。非常建议有空的同学过一遍starlette,uvicorn,fastapi的源码。加起来也没有django多。

4. 相关生态和社区还未成熟

python的异步发展略为缓慢,仅仅fastapi还不能撑起一片天。例如现在还没有完全可靠的异步orm。不少东西还需要自己造轮子。在小项目上,这可能影响不是很大。直接写代码可能比配置插件来的快。但将很大程度上影响它被采用到线上生产环境。

总结

你可以将fastapi看成新出炉的flask plus。如果你有采用flask的理由,那么你同样有将来采用fastapi的理由。

---------------------------12月4日---------------------------

在tx1核1G的轻量服务器上用webbench做了简单的压力测试,仅供娱乐

每轮60s,先做一次300并发,三次500并发。

总共四轮,分别是pypy+asyncio+h11

cpython+asyncio+h11

cpython+uvloop+h11

cpython+asyncio+httptools

cpython+uvloop+httptools

pypy

300 173159

500 191221

500 189293

500 188677

cpython asyncio h11

300 89190

500 89362

500 88625

500 90654

cpython uvloop h11

300 108244

500 111819

500 111734

500 111788

cpython asyncio httptools

300 137613

500 132912

500 134995

500 135674

cpython uvloop httptools

300 174222

500 175347

500 176832

500 173020

结论:在上述情况下以cpython+asyncio+h11为基础

uvloop带来约24%提升

httptools带来约51%提升

uvloop+httptools带来约95%提升

pypy带来约107%提升

另外uvicorn声明了httptools和uvloop不支持pypy

试着在pypy下使用httptools,确实能跑起来,但跑一会就会卡死。进程直接崩掉。

如果pypy能有高性能的http解析器,应该会有许多提升空间。

pypy和pydantic在之前有人提出过存在不兼容问题,不知道这个坑现在是否仍然存在,这次加入了pydantic的简单使用未发现明显问题

上述测试仅供娱乐参考,实际业务必然不会这么简单,背上各种业务后,可以预测得会被稀释。但pypy的优势可能会相对保持得多一些。

像异步,orm,orjson之类的很多内容没有加入参考。

---------------------------11月27日---------------------------

关于异步ORM

SQLAlchemy 1.4.0b1 Released

NOVEMBER 02, 2020 permalinkby Mike BPython asynciosupport is now fully integrated for both Core and ORM, to provide one of the first fully capable Python object relational mappers for asyncio

The asyncio should be regarded as alpha levelfor the 1.4 release of SQLAlchemy. API details are subject to changeat any time.

等就完事了。

---------------------------1月17日---------------------------

看到FastAPI没有CBV方面貌似有些诟病, 实际上Starlette是有CBV的, 但是FastAPI和Starlette的内部略有不同, 主要是类型检测和依赖注入, 需要对endpoint进行inspect. 很明显没法对一个类对象进行inspect抓参, 所以默认情况下endpoint只能是函数(Starlette中只要可以调用就可以作为endpoint, 所以可以把__call__拟态一下)

参考FastAPI团队的David Montague写的工具包中CBV的思路.

自己改进了一下, 且加入了WebSocket的CBV.https://github.com/Gascognya/fastapi_cbv​github.com

再次十分感谢David Montague, 他的反射技巧让我感到惊叹.https://github.com/dmontagu/fastapi-utils​github.com

你可能感兴趣的:(fastapi,python,并发)