在python的整体生态中,虽然已经有很多库支持了异步调用,如可以使用httpx或者aiohttp代替requests库发起http请求,使用asyncio.sleep 代替time.sleep, 但是依然还有很多优秀的第三方库是不支持异步调用也没有可代替的库,那么如何在FastAPI中调用这种没有实现异步的库但是又不阻塞整个系统呢?
查看官方文档,https://fastapi.tiangolo.com/zh/async/ ,最后有个简要的结论
- 如果你的函数中有使用await,则函数使用async def 定义。
- 如果不知道是否要使用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"
FastAPI中同步与异步IO操作使用建议

最低0.47元/天 解锁文章
493

被折叠的 条评论
为什么被折叠?



