FastApi async函数一定比普通函数快吗,你是否有相同的问号

发布时间 2023-09-15 16:36:25作者: 弩哥++

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秒左右

image

二、只加了async关键字的协程函数

@app.get('/wash')
async def wash_clothes():
    start = time.time()
    time.sleep(1)
    end = time.time()
    return {"time": end - start}
结果:总共耗时50秒,最小值1秒,最大值等待了49秒,我的理解是仅仅了加了关键字,但是没有把耗时的代码加入到事件循环当队列中,所以一个个干等,中间的耗时代码无法挂起

image

三、加了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秒左右,

image

四、因为上一步的实验,协程的函数与普通的函数在50并发数下差别不大,现在将并发数调整为150再试一试
  • 普通函数(150并发,总共耗时4秒)
    image

  • 协程函数(150并发,总共耗时2秒)
    image

结论,async函数,如果用正确了在并发的情况下确实是比普通函数要快,但是一定要用正确,否则比普通函数还要慢,还有就是普通函数用的是多线程的技术,放入到的thread pool中的