Python 带有 FastAPI 的 websocket 不会立即 return 数据
Python websocket with FastAPI does not return data immediately
我使用 FastAPI 创建了一个 websocket 连接,以“流式传输”来自繁琐计算的数据。数据块应该在可用时立即发送,而不是在最后一起发送。
在下面的代码片段中,我的问题得到了简化。 sleep()这里要模拟结果数据之间的计算时间
from fastapi import FastAPI, WebSocket
import uvicorn
from time import sleep
app = FastAPI()
@app.websocket("/")
async def endpoint(websocket: WebSocket):
await websocket.accept()
while True:
command = await websocket.receive_text()
if command == "getData":
data = {"name": "NAME1", "result": "ABC"}
await websocket.send_json(data)
sleep(3)
data = {"name": "NAME2", "result": "DEF"}
await websocket.send_json(data)
sleep(3)
data = {"name": "NAME3", "result": "GHI"}
await websocket.send_json(data)
if __name__ == "__main__":
uvicorn.run("api:app", host="127.0.0.1", port=8000, reload=True)
问题是执行此代码时,客户端在 6 秒内没有收到任何数据,之后所有数据都立即传输。为什么会这样,我怎样才能让数据块一可用就一个一个地发回?
time.sleep
是阻塞操作,所以连事件循环都挂在当前线程
尝试使用 asyncio.sleep
即 non-blocking。
我使用 FastAPI 创建了一个 websocket 连接,以“流式传输”来自繁琐计算的数据。数据块应该在可用时立即发送,而不是在最后一起发送。 在下面的代码片段中,我的问题得到了简化。 sleep()这里要模拟结果数据之间的计算时间
from fastapi import FastAPI, WebSocket
import uvicorn
from time import sleep
app = FastAPI()
@app.websocket("/")
async def endpoint(websocket: WebSocket):
await websocket.accept()
while True:
command = await websocket.receive_text()
if command == "getData":
data = {"name": "NAME1", "result": "ABC"}
await websocket.send_json(data)
sleep(3)
data = {"name": "NAME2", "result": "DEF"}
await websocket.send_json(data)
sleep(3)
data = {"name": "NAME3", "result": "GHI"}
await websocket.send_json(data)
if __name__ == "__main__":
uvicorn.run("api:app", host="127.0.0.1", port=8000, reload=True)
问题是执行此代码时,客户端在 6 秒内没有收到任何数据,之后所有数据都立即传输。为什么会这样,我怎样才能让数据块一可用就一个一个地发回?
time.sleep
是阻塞操作,所以连事件循环都挂在当前线程
尝试使用 asyncio.sleep
即 non-blocking。