Creé una conexión websocket con FastAPI para "transmitir" datos que provienen de un cálculo tedioso. Los fragmentos de datos deben enviarse tan pronto como estén disponibles y no del todo al final. En el siguiente código cortado muestra mi problema simplificado. sleep() aquí simulará el tiempo de cálculo entre los datos resultantes.
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)El problema es que al ejecutar este código, el cliente no recibe datos durante 6 segundos y luego todos los datos se transmiten a la vez. ¿Por qué sucede esto y cómo puedo hacer que los fragmentos de datos se envíen uno por uno tan pronto como estén disponibles?
time.sleep es una operación de bloqueo, por lo que incluso el bucle de eventos se suspende en el hilo actual.
Intente usar asyncio.sleep que no bloquea.