由于某种原因,FastAPI 在处理请求时不会响应任何请求。我希望 FastAPI 能够同时处理多个请求。我希望允许同时进行多个调用,因为多个用户可能正在访问 REST API。
启动服务器后:
uvicorn minimal:app --reload
,运行request_testrun request_test
并执行test()
,我得到了预期的{'message': 'Done'}
。但是,当我在第一个请求的 20 秒帧内再次执行它时,直到第一次调用的 sleep_async
完成后才会处理该请求。
即使我不使用异步调用并直接在异步定义信息中等待,也存在相同的问题(我在下面描述)。这对我来说没有意义。
#!/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"})
#!/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)
您需要按照uvicorn设置
所示设置工人数量--workers <int>
这是因为虽然你确实编写了一个异步函数,但里面调用的 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"})