Tareas en Segundo Plano¶
🌐 Traducción por IA y humanos
Esta traducción fue hecha por IA guiada por humanos. 🤝
Podría tener errores al interpretar el significado original, o sonar poco natural, etc. 🤖
Puedes mejorar esta traducciónayudándonos a guiar mejor al LLM de IA.
Puedes definir tareas en segundo plano para que se ejecutendespués de devolver un response.
Esto es útil para operaciones que necesitan ocurrir después de un request, pero para las que el cliente realmente no necesita esperar a que la operación termine antes de recibir el response.
Esto incluye, por ejemplo:
- Notificaciones por email enviadas después de realizar una acción:
- Como conectarse a un servidor de email y enviar un email tiende a ser "lento" (varios segundos), puedes devolver el response de inmediato y enviar la notificación por email en segundo plano.
- Procesamiento de datos:
- Por ejemplo, supongamos que recibes un archivo que debe pasar por un proceso lento, puedes devolver un response de "Accepted" (HTTP 202) y procesar el archivo en segundo plano.
UsandoBackgroundTasks¶
Primero, importaBackgroundTasks y define un parámetro en tupath operation function con una declaración de tipo deBackgroundTasks:
fromfastapiimportBackgroundTasks,FastAPIapp=FastAPI()defwrite_notification(email:str,message=""):withopen("log.txt",mode="w")asemail_file:content=f"notification for{email}:{message}"email_file.write(content)@app.post("/send-notification/{email}")asyncdefsend_notification(email:str,background_tasks:BackgroundTasks):background_tasks.add_task(write_notification,email,message="some notification")return{"message":"Notification sent in the background"}FastAPI creará el objeto de tipoBackgroundTasks por ti y lo pasará como ese parámetro.
Crear una función de tarea¶
Crea una función para que se ejecute como la tarea en segundo plano.
Es solo una función estándar que puede recibir parámetros.
Puede ser una funciónasync def o una función normaldef,FastAPI sabrá cómo manejarla correctamente.
En este caso, la función de tarea escribirá en un archivo (simulando el envío de un email).
Y como la operación de escritura no usaasync yawait, definimos la función con undef normal:
fromfastapiimportBackgroundTasks,FastAPIapp=FastAPI()defwrite_notification(email:str,message=""):withopen("log.txt",mode="w")asemail_file:content=f"notification for{email}:{message}"email_file.write(content)@app.post("/send-notification/{email}")asyncdefsend_notification(email:str,background_tasks:BackgroundTasks):background_tasks.add_task(write_notification,email,message="some notification")return{"message":"Notification sent in the background"}Agregar la tarea en segundo plano¶
Dentro de tupath operation function, pasa tu función de tarea al objeto debackground tasks con el método.add_task():
fromfastapiimportBackgroundTasks,FastAPIapp=FastAPI()defwrite_notification(email:str,message=""):withopen("log.txt",mode="w")asemail_file:content=f"notification for{email}:{message}"email_file.write(content)@app.post("/send-notification/{email}")asyncdefsend_notification(email:str,background_tasks:BackgroundTasks):background_tasks.add_task(write_notification,email,message="some notification")return{"message":"Notification sent in the background"}.add_task() recibe como argumentos:
- Una función de tarea para ejecutar en segundo plano (
write_notification). - Cualquier secuencia de argumentos que deba pasarse a la función de tarea en orden (
email). - Cualquier argumento de palabras clave que deba pasarse a la función de tarea (
message="some notification").
Inyección de Dependencias¶
UsarBackgroundTasks también funciona con el sistema de inyección de dependencias, puedes declarar un parámetro de tipoBackgroundTasks en varios niveles: en unapath operation function, en una dependencia (dependable), en una sub-dependencia, etc.
FastAPI sabe qué hacer en cada caso y cómo reutilizar el mismo objeto, de modo que todas las tareas en segundo plano se combinan y ejecutan en segundo plano después:
fromtypingimportAnnotatedfromfastapiimportBackgroundTasks,Depends,FastAPIapp=FastAPI()defwrite_log(message:str):withopen("log.txt",mode="a")aslog:log.write(message)defget_query(background_tasks:BackgroundTasks,q:str|None=None):ifq:message=f"found query:{q}\n"background_tasks.add_task(write_log,message)returnq@app.post("/send-notification/{email}")asyncdefsend_notification(email:str,background_tasks:BackgroundTasks,q:Annotated[str,Depends(get_query)]):message=f"message to{email}\n"background_tasks.add_task(write_log,message)return{"message":"Message sent"}🤓 Other versions and variants
Tip
Prefer to use theAnnotated version if possible.
fromfastapiimportBackgroundTasks,Depends,FastAPIapp=FastAPI()defwrite_log(message:str):withopen("log.txt",mode="a")aslog:log.write(message)defget_query(background_tasks:BackgroundTasks,q:str|None=None):ifq:message=f"found query:{q}\n"background_tasks.add_task(write_log,message)returnq@app.post("/send-notification/{email}")asyncdefsend_notification(email:str,background_tasks:BackgroundTasks,q:str=Depends(get_query)):message=f"message to{email}\n"background_tasks.add_task(write_log,message)return{"message":"Message sent"}En este ejemplo, los mensajes se escribirán en el archivolog.txtdespués de que se envíe el response.
Si hay un query en el request, se escribirá en el log en una tarea en segundo plano.
Y luego otra tarea en segundo plano generada en lapath operation function escribirá un mensaje usando el parámetro de pathemail.
Detalles Técnicos¶
La claseBackgroundTasks proviene directamente destarlette.background.
Se importa/incluye directamente en FastAPI para que puedas importarla desdefastapi y evitar importar accidentalmente la alternativaBackgroundTask (sin las al final) destarlette.background.
Al usar soloBackgroundTasks (y noBackgroundTask), es posible usarla como un parámetro depath operation function y dejar queFastAPI maneje el resto por ti, tal como cuando usas el objetoRequest directamente.
Todavía es posible usarBackgroundTask solo en FastAPI, pero debes crear el objeto en tu código y devolver unaResponse de Starlette incluyéndolo.
Puedes ver más detalles enla documentación oficial de Starlette sobre Background Tasks.
Advertencia¶
Si necesitas realizar una computación intensa en segundo plano y no necesariamente necesitas que se ejecute por el mismo proceso (por ejemplo, no necesitas compartir memoria, variables, etc.), podrías beneficiarte del uso de otras herramientas más grandes comoCelery.
Tienden a requerir configuraciones más complejas, un gestor de cola de mensajes/trabajos, como RabbitMQ o Redis, pero te permiten ejecutar tareas en segundo plano en múltiples procesos, y especialmente, en múltiples servidores.
Pero si necesitas acceder a variables y objetos de la misma app deFastAPI, o necesitas realizar pequeñas tareas en segundo plano (como enviar una notificación por email), simplemente puedes usarBackgroundTasks.
Resumen¶
Importa y usaBackgroundTasks con parámetros enpath operation functions y dependencias para agregar tareas en segundo plano.







