浅谈FastAPI到底用不用async问题

 更新时间:2024年06月21日 10:25:41   作者:程序员的战歌  
这篇文章主要介绍了FastAPI到底用不用async问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

FastAPI到底用不用async

FastAPI的很快,归功于它的异步处理。

那我们用FastAPI框架时,函数到底用不用async模式?

官方文档:

https://fastapi.tiangolo.com/async/

做个实验

from fastapi import APIRouter
import time
import asyncio

router = APIRouter()


@router.get("/a")
async def a():
    time.sleep(1)
    return {"message": "异步模式,但是同步执行sleep函数,执行过程是串行的"}


@router.get("/b")
async def b():
    loop = asyncio.get_event_loop()
    await loop.run_in_executor(None, time.sleep, 1)
    return {"message": "线程池中运行sleep函数"}


@router.get("/c")
async def c():
    await asyncio.sleep(1)
    return {"message": "异步模式,且异步执行sleep函数"}


@router.get("/d")
def d():
    time.sleep(1)
    return {"message": "同步模式,但是FastAPI会放在线程池中运行,所以很快"}

我们并发100个请求分别测试这4个接口。

结果

  • /a接口:100秒
  • /b接口:1秒
  • /c接口:1秒
  • /d接口:3秒

/a接口

  • fastapi框架会将async函数会放到event loop中运行。
  • 虽然使用了async,但是函数内部并没有用到await,所以堵塞了。
  • 执行过程是串行的,所以总耗时100秒。

/b接口

  • 利用asyncio异步IO获取当前的event loop。
  • 然后将time.sleep(1)放到一个event loop中去运行,函数内部用到了await,所以无堵塞。
  • 执行过程是并行的,所以总耗时1秒。

/c接口

  • 使用异步IO的sleep取代了普通的同步sleep。
  • 原理与/b接口一致。
  • 执行过程是并行的,所以总耗时1秒。

/d接口

  • 这个函数没有async修饰,即一个普通函数。
  • 但是FastAPI会将函数放到thread pool中执行。
  • 服务器是8核CPU,线程池的默认配置是核心数*5=40。
  • 服务器在第一秒和第二秒分别处理40个请求,第三秒处理20个请求。
  • 所以100个并发总耗时3秒。

总结

官方说,无论你是否使用async,FastAPI都会采用异步的方式处理。

但是,如果你定义了async函数,函数体却是同步的调用(例:/a接口),将导致函数执行过程变成串行。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • pycharm实现print输出保存到txt文件

    pycharm实现print输出保存到txt文件

    这篇文章主要介绍了pycharm实现print输出保存到txt文件,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python实现List列表去重的五种方案

    Python实现List列表去重的五种方案

    本文详细介绍了Python中列表去重的多种方法,包括list(set(lst))、dict.fromkeys(lst)、列表推导式、pandas.Series.drop_duplicates()和sorted(list(groupby(lst)))等,并分析了它们的底层原理和效率差异,需要的朋友可以参考下
    2025-12-12
  • Python连接MySQL数据库连接池的操作详解

    Python连接MySQL数据库连接池的操作详解

    连接池的优点是可以在多个线程或进程之间共享,并且可以有效地管理连接数,而无需手动打开和关闭连接,下面我们就来看看Python如何连接MySQL数据库连接池吧
    2025-05-05
  • Python Ruby 等语言弃用自增运算符原因剖析

    Python Ruby 等语言弃用自增运算符原因剖析

    这篇文章主要为大家介绍了Python Ruby 等语言弃用自增运算符原因剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • HTML中使用python屏蔽一些基本功能的方法

    HTML中使用python屏蔽一些基本功能的方法

    这篇文章主要介绍了HTML中使用python屏蔽一些基本功能的方法,需要的朋友可以参考下
    2017-07-07
  • python绘制玫瑰的实现代码

    python绘制玫瑰的实现代码

    这篇文章主要介绍了python绘制玫瑰的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Python Scrapy图片爬取原理及代码实例

    Python Scrapy图片爬取原理及代码实例

    这篇文章主要介绍了Python Scrapy图片爬取原理及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 使用pyscript在网页中撰写Python程式的方法

    使用pyscript在网页中撰写Python程式的方法

    本文主要介绍了使用pyscript在网页中撰写Python程式的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • python人工智能tensorflow构建卷积神经网络CNN

    python人工智能tensorflow构建卷积神经网络CNN

    学习神经网络已经有一段时间,从普通的BP神经网络到LSTM长短期记忆网络都有一定的了解,但是从未系统的把整个神经网络的结构记录下来,我相信这些小记录可以帮助我更加深刻的理解神经网络
    2022-05-05
  • Python中列表元素转为数字的方法分析

    Python中列表元素转为数字的方法分析

    这篇文章主要介绍了Python中列表元素转为数字的方法,结合实例形式对比分析了Python列表操作及数学运算的相关技巧,需要的朋友可以参考下
    2016-06-06

最新评论