FastAPI中如果async def和def 路由的区别

FastAPI中同步与异步IO操作使用建议

在python的整体生态中,虽然已经有很多库支持了异步调用,如可以使用httpx或者aiohttp代替requests库发起http请求,使用asyncio.sleep 代替time.sleep, 但是依然还有很多优秀的第三方库是不支持异步调用也没有可代替的库,那么如何在FastAPI中调用这种没有实现异步的库但是又不阻塞整个系统呢?

查看官方文档,https://fastapi.tiangolo.com/zh/async/ ,最后有个简要的结论

  1. 如果你的函数中有使用await,则函数使用async def 定义。
  2. 如果不知道是否要使用async,则不要用,使用def 就好。

原理:

**在python 中,使用async def 定义的函数是运行在协程中,而多个协程是在一个主线程中的。fastapi中的async def协程路由处理的请求会全部放在main thread,而def 处理的请求每个都有自己的独立线程,fastapi内部会自动为这两种接口进行对应的处理逻辑 **

我们来详细看一下各种情况。本文将使用await asyncio.sleep(5) 来模拟实现了异步操作的库。time.sleep(5) 来模拟只有同步操作的库。

只有同步库

import time  
  
from fastapi import FastAPI, Request  
import asyncio  
import threading  
import uvicorn  
  
app = FastAPI()  
  
@app.middleware("http")  
async def cal_time(req: Request, call_next):  
    start = time.time()  
    response = await call_next(req)  
    process_time = time.time() - start  
    print(f"接口{
     
     req.url.path} use {
     
     process_time} sec.")  
    return response  
  
@app.get("/test1")  
def test1():  
    print(threading.current_thread(), "test1")  
    return "test1"  
  
@app.get("/test2"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值