如何让FastAPI同时处理多个请求?

问题描述 投票:0回答:2

由于某种原因,FastAPI 在处理请求时不会响应任何请求。我希望 FastAPI 能够同时处理多个请求。我希望允许同时进行多个调用,因为多个用户可能正在访问 REST API。

最小示例:异步进程

启动服务器后:

uvicorn minimal:app --reload
,运行request_test
run request_test
并执行
test()
,我得到了预期的
{'message': 'Done'}
。但是,当我在第一个请求的 20 秒帧内再次执行它时,直到第一次调用的
sleep_async
完成后才会处理该请求。

没有异步进程

即使我不使用异步调用并直接在异步定义信息中等待,也存在相同的问题(我在下面描述)。这对我来说没有意义。

FastAPI:最小

#!/usr/bin/env python3
from fastapi import FastAPI
from fastapi.responses import JSONResponse
import time
import asyncio

app = FastAPI()

@app.get("/test/info/")
async def info():
    async def sleep_async():
        time.sleep(20)
        print("Task completed!")
    asyncio.create_task(sleep_async())
    return JSONResponse(content={"message": "Done"})

测试:request_test

#!/usr/bin/env python3

import requests

def test():
    print("Before")
    response = requests.get(f"http://localhost:8000/test/info")
    print("After")
    response_data = response.json()
    print(response_data)
python asynchronous fastapi
2个回答
0
投票

您需要按照uvicorn设置

所示设置工人数量
--workers <int>

0
投票

这是因为虽然你确实编写了一个异步函数,但里面调用的 time.sleep() 方法不是异步的。异步函数不应该具有阻塞其中线程的方法。您只需修改代码以使用

asyncio.sleep()
即可解决此问题:

#!/usr/bin/env python3
from fastapi import FastAPI
from fastapi.responses import JSONResponse
import time
import asyncio

app = FastAPI()

@app.get("/test/info/")
async def info():
    async def sleep_async():
        await asyncio.sleep(20)
        print("Task completed!")
    asyncio.create_task(sleep_async())
    return JSONResponse(content={"message": "Done"})

如下所示,请求正在同时处理;

© www.soinside.com 2019 - 2024. All rights reserved.