Un Celery worker es un componente clave de Celery, una biblioteca de Python que sirve para gestionar y ejecutar tareas en segundo plano (background tasks). Los workers son los procesos encargados de recibir las tareas enviadas a la cola (queue) por la aplicaci贸n principal y ejecutarlas de forma as铆ncrona. Esto es especialmente 煤til para tareas que pueden ser lentas o intensivas en recursos, como enviar correos electr贸nicos, procesar im谩genes o realizar c谩lculos complejos.
¿Para qu茅 sirve un Celery worker?
- Ejecuci贸n de tareas as铆ncronas: Permite que tu aplicaci贸n principal delegue tareas sin bloquear el flujo principal.
- Procesamiento distribuido: Puedes tener m煤ltiples workers ejecutando tareas en paralelo, lo cual mejora la eficiencia y la escalabilidad.
-
Gesti贸n de tareas programadas: Puede ejecutar tareas
repetitivas o programadas (usando herramientas adicionales como
celery beat
).
Estructura b谩sica de un Celery worker
Para configurar y usar un Celery worker, necesitas al menos los siguientes componentes:
-
Archivo de configuraci贸n de Celery (
celery.py
) Define la aplicaci贸n Celery y su configuraci贸n: -
Tareas definidas (
tasks.py
) Son las funciones que quieres ejecutar de forma as铆ncrona: - Iniciar el worker Una vez configuradas las tareas y el broker (como Redis o RabbitMQ), puedes iniciar el worker con el siguiente comando en la terminal:
-
-A nombre_del_proyecto.celery
: Especifica la aplicaci贸n Celery. -
worker
: Inicia el worker para procesar tareas. -
--loglevel=info
: Define el nivel de detalle de los logs. - Enviar una tarea Desde cualquier parte de tu c贸digo, puedes enviar una tarea al worker:
from celery import Celery
celery = Celery(
'nombre_del_proyecto',
broker='redis://localhost:6379/0', # URL del broker de mensajes
backend='redis://localhost:6379/0' # Almac茅n de resultados
)
celery.conf.update(
task_serializer='json',
accept_content=['json'],
result_serializer='json',
timezone='UTC',
enable_utc=True
)
from .celery import celery
@celery.task
def enviar_correo(email, asunto):
print(f"Enviando correo a {email} con asunto: {asunto}")
celery -A nombre_del_proyecto.celery worker --loglevel=info
from nombre_del_proyecto.tasks import enviar_correo
enviar_correo.delay('usuario@example.com', 'Bienvenido a Celery')
Flujo de trabajo del Celery worker
- La aplicaci贸n principal env铆a una tarea al broker (como Redis).
- El Celery worker recupera la tarea del broker.
- El worker ejecuta la tarea de forma as铆ncrona.
- Si se configur贸 un backend, los resultados se almacenan para ser consultados m谩s adelante.
Resumen
Un Celery worker es esencial para manejar tareas en segundo plano de manera eficiente, separando la l贸gica de ejecuci贸n intensiva de la aplicaci贸n principal. Con una estructura modular, Celery permite escalar aplicaciones y procesar tareas distribuidas en m煤ltiples workers para mejorar el rendimiento general del sistema.
C贸digo para configurar Celery en el proyecto metabuscador
metabuscador/
├── src/
│ └── metabuscador/
│ ├── __init__.py
│ ├── settings.py
│ ├── tasks/
│ │ ├── __init__.py
│ │ ├── celery_tasks/
│ │ │ ├── __init__.py
│ │ │ ├── celery.py
│ │ │ ├── tasks.py
│ │ │ └── utils.py
│ ├── apps/
│ │ ├── __init__.py
│ │ ├── buscador/
│ │ │ ├── __init__.py
│ │ │ ├── models.py
│ │ │ ├── views.py
│ │ │ ├── tests.py
│ │ │ ├── urls.py
│ │ │ └── templates/
│ │ │ ├── base.html
│ │ │ └── buscador.html
├── static/
│ ├── css/
│ ├── js/
│ └── img/
├── templates/
│ └── base.html
├── tests/
├── docs/
├── .venv/
├── logs/
│ ├── celery.log
│ └── app.log
├── manage.py
├── requirements.txt
├── README.md
├── setup.py
└── .gitignore
¿C贸mo funciona el env铆o de tareas?
En Celery, definimos funciones como tareas en un archivo espec铆fico (por ejemplo, tasks.py
). Luego, puedes "enviar" o "invocar" estas tareas desde cualquier lugar de tu proyecto, lo que significa que las colocas en la cola (queue) para que los workers las procesen.
¿Qu茅 nombre debe tener el archivo?
El archivo donde defines las tareas generalmente se llama tasks.py
, pero puedes usar cualquier nombre si lo organizas bien en tu estructura de proyecto. Por ejemplo, en este caso, tienes este archivo estructurado como:
metabuscador/
├── src/
│ └── metabuscador/
│ ├── tasks/
│ │ ├── celery_tasks/
│ │ │ ├── tasks.py # Archivo donde defines las tareas
As铆 que puedes usar tasks.py
para definir las tareas y hacer referencia a ellas en tu c贸digo, como sigue.
Ejemplo en el archivo tasks.py
Define tus tareas en src/metabuscador/tasks/celery_tasks/tasks.py
:
from .celery import celery
@celery.task
def enviar_correo(email, asunto):
return f"Correo enviado a {email} con el asunto: {asunto}"
@celery.task
def suma(a, b):
return a + b
Enviar tareas desde otro archivo del proyecto
Puedes llamar o "enviar" estas tareas desde cualquier otro archivo de tu proyecto. Aqu铆 tienes un ejemplo:
from src.metabuscador.tasks.celery_tasks.tasks import enviar_correo, suma
# Enviar la tarea al worker
resultado_suma = suma.delay(3, 5)
resultado_correo = enviar_correo.delay("usuario@example.com", "Bienvenido")
# Opcional: Obtener el resultado si lo necesitas
print(f"Resultado de la suma: {resultado_suma.get()}")
print(f"Resultado del correo: {resultado_correo.get()}")
¿Qu茅 hace delay()
?
El m茅todo .delay()
env铆a la tarea a la cola de Celery para que el worker la procese en segundo plano. Esto asegura que la tarea no se ejecute en la misma l铆nea de c贸digo y no bloquee otras operaciones en tu aplicaci贸n.
Invocar tareas Celery
El archivo desde donde env铆as tareas (o invocas tareas Celery) puede estar ubicado en cualquier parte de tu proyecto, siempre y cuando la ruta al archivo que contiene las tareas definidas (tasks.py
) est茅 correctamente referenciada. Sin embargo, la ubicaci贸n depende de la l贸gica y estructura de tu proyecto.
Considerando la estructura del proyecto metabuscador, aqu铆 hay sugerencias sobre d贸nde podr铆a estar ubicado el archivo desde el cual enviar铆as las tareas:
1. Dentro de tu aplicaci贸n principal (Ejemplo: buscador/views.py
)
Este es el enfoque m谩s com煤n si est谩s enviando tareas desde una vista de tu aplicaci贸n (por ejemplo, en Django):
src/metabuscador/apps/buscador/views.py
Contenido del archivo:
from src.metabuscador.tasks.celery_tasks.tasks import enviar_correo
def procesar_solicitud():
# Enviar la tarea al worker
resultado = enviar_correo.delay("usuario@example.com", "Bienvenido")
print(f"Tarea enviada, ID: {resultado.id}")
2. Desde un script separado (Ejemplo: scripts/enviar_tareas.py
)
Si prefieres enviar tareas de manera puntual o probarlas, puedes crear un archivo en una carpeta llamada scripts
:
metabuscador/scripts/enviar_tareas.py
Contenido del archivo:
from src.metabuscador.tasks.celery_tasks.tasks import enviar_correo, suma
# Ejemplo de env铆o de tareas
if __name__ == "__main__":
resultado_suma = suma.delay(2, 3)
print(f"Resultado de suma enviado, ID: {resultado_suma.id}")
resultado_correo = enviar_correo.delay("usuario@example.com", "Bienvenido")
print(f"Correo enviado, ID: {resultado_correo.id}")
Para ejecutarlo desde la terminal:
python metabuscador/scripts/enviar_tareas.py
3. Dentro de tu l贸gica de negocio (Ejemplo: buscador/models.py
o cualquier otro archivo)
Si quieres invocar tareas directamente desde los modelos o l贸gica interna, puedes hacerlo:
src/metabuscador/apps/buscador/models.py
Contenido del archivo:
from src.metabuscador.tasks.celery_tasks.tasks import enviar_correo
class Usuario:
def registrar(self, email):
# L贸gica de registro
enviar_correo.delay(email, "¡Gracias por registrarte!")
4. Para pruebas o automatizaciones (Ejemplo: en tests.py
)
Tambi茅n puedes usar las tareas Celery en pruebas o automatizaciones:
src/metabuscador/apps/buscador/tests.py
Contenido del archivo:
from src.metabuscador.tasks.celery_tasks.tasks import suma
def test_suma():
resultado = suma.delay(10, 20)
assert resultado.get() == 30
Resumen:
El archivo que env铆a las tareas puede estar en cualquier parte del proyecto (como en views.py
, models.py
, o un script separado como scripts/enviar_tareas.py
). Lo 煤nico importante es:
- Importar correctamente la tarea desde su ubicaci贸n (
tasks.py
). - Tener tu entorno configurado adecuadamente, para que Celery y los workers puedan procesar las tareas.
Si quieres una recomendaci贸n, te sugiero empezar por views.py
si est谩s trabajando con l贸gica web (como Django), o un script separado para pruebas.