FastApi async函数一定比普通函数快吗,你是否有相同的问号
FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示
关键特性:
-
快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。
-
高效编码:提高功能开发速度约 200% 至 300%。*
-
更少 bug:减少约 40% 的人为(开发者)导致错误。*
-
智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
-
简单:设计的易于使用和学习,阅读文档的时间更短。
-
简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
-
健壮:生产可用级别的代码。还有自动生成的交互式文档。
-
标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。
在Fastapi中,到底函数直接定义为async函数还是普通函数呢?如果直接写成async 就直接比普通函数快吗?
我脑子里充满了问号????????决定,试一试,直接开干!!!!!!!
实验工具
- jmeter
- 线程数设置的50,相当于并发用户数50
- 采取实验的方式为:普通函数、只加了async关键字的协程函数、使用了async和await的协程函数
一、普通函数
@app.get('/wash')
def wash_clothes():
start = time.time()
time.sleep(1)
end = time.time()
return {"time": end - start}
结果:总共耗时2秒,平均1秒左右
二、只加了async关键字的协程函数
@app.get('/wash')
async def wash_clothes():
start = time.time()
time.sleep(1)
end = time.time()
return {"time": end - start}
结果:总共耗时50秒,最小值1秒,最大值等待了49秒,我的理解是仅仅了加了关键字,但是没有把耗时的代码加入到事件循环当队列中,所以一个个干等,中间的耗时代码无法挂起
三、加了async、await关键字的协程函数
@app.get('/wash')
async def wash_clothes():
start = time.time()
# time.sleep(1)
await asyncio.sleep(1) # 这里要用asyncio模块下的sleep,才是可等待的对象
end = time.time()
return {"time": end - start}
结果:总共耗时2秒,平均1秒左右,
四、因为上一步的实验,协程的函数与普通的函数在50并发数下差别不大,现在将并发数调整为150再试一试
-
普通函数(150并发,总共耗时4秒)
-
协程函数(150并发,总共耗时2秒)
结论,async函数,如果用正确了在并发的情况下确实是比普通函数要快,但是一定要用正确,否则比普通函数还要慢,还有就是普通函数用的是多线程的技术,放入到的thread pool中的
本文来自博客园,作者:弩哥++,转载请注明原文链接:https://www.cnblogs.com/bangbangzoutianya/p/17700898.html