Usando python 3x en una Mac. Tengo un servidor FastAPI con un punto final. En este punto final, quiero poder ejecutar algunas tareas en segundo plano. Una vez que se completan, realiza algunos cálculos y solo luego envía una respuesta HTTP.
Lo que tengo es lo siguiente:
import asyncio import uvicorn from fastapi import BackgroundTasks, FastAPI app = FastAPI() async def log(message: str): print(f"start to process message: {message}") if message == "aaaaa": await asyncio.sleep(10) else: await asyncio.sleep(3) print(f"processed {message}") async def process(): tasks = [log('aaaaa'), log('bbbbb')] print("start processing the tasks") await asyncio.gather(*tasks) print(" we are done with all the tasks") @app.post("/upload-to-process") async def upload(background_tasks: BackgroundTasks): background_tasks.add_task(process) return {"result": "all tasks are completed successfully successfully"} if __name__ == "__main__": uvicorn.run(app, host="localhost", port=8001)lo anterior lo que hace es enviar el resultado inmediatamente y no esperar a que se completen las tareas.
¿Cómo cambio el código anterior para esperar hasta que se completen todos los fondos y solo luego enviar la respuesta?
Realmente no tiene sentido esperar las tareas en segundo plano , ya que se ejecutan por definición en segundo plano.
Si lo que quieres es ejecutar la función que ejecuta esas tareas de forma síncrona , es decir, no en segundo plano, puedes hacer esto:
@app.post("/upload-to-process") async def upload(background_tasks: BackgroundTasks): await process() return {"result": "all tasks are completed successfully successfully"}Tenga en cuenta, sin embargo, que si esas tareas tardan demasiado (esto depende de los límites de tiempo de solicitud de configuración de su servidor, que generalmente varían entre 30 segundos y 15 minutos), la solicitud se agotará.