Integración de Celery en Django para Manejo de Tareas Asincrónicas y Periódicas

Para implementar tareas asíncronas y programadas en Django, se puede utilizra Celery con Redis como intermediario de mensajes. A continuación se detallan los pasos de configuración.

Configuración del Servidor Redis

Se requiere un servidor Redis como broker. Ejemplo de instalación mediante Docker:

docker run -itd --name redis-servidor -p 6379:6379 redis:alpine redis-server --requirepass clave_segura

Este comando inicia un contenedor Redis con la contraseña especificada.

Instalación de Dependencias en Python

Instale Celery y el cliente de Redis usando pip:

pip install celery redis

Configuración de Celery en el Proyecto Django

Cree un archivo celery.py en el directorio raíz del proyecto junto a settings.py:

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mi_proyecto.settings')

celery_app = Celery('mi_proyecto')
celery_app.config_from_object('django.conf:settings', namespace='CELERY')
celery_app.autodiscover_tasks()

Agregue la siguiente configuración en settings.py:

CELERY_BROKER_URL = 'redis://:clave_segura@localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://:clave_segura@localhost:6379/0'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TIMEZONE = 'America/Mexico_City'
CELERY_ENABLE_UTC = True

Modifique el archivo __init__.py del proyecto para importar la aplicación Celery:

from .celery import celery_app as app

__all__ = ('app',)

Deefinición de Tareas en la Aplicación

En su aplicación Django, cree un archivo tasks.py con las funciones de tarea. Ejemplo:

from celery import shared_task
from django.core.mail import send_mail

@shared_task
def enviar_correo():
    # Lógica para enviar correo electrónico
    print("Correo enviado de manera asíncrona.")

Ejecución de Tareas Asincrónicas

Para ejecutar una tarea asincrónicamente, llame a la función con el método delay(). Ejemplo en una vista:

from .tasks import enviar_correo
from django.http import HttpResponse

def vista_ejemplo(request):
    enviar_correo.delay()
    return HttpResponse("Tarea iniciada en segundo plano.")

Configuración de Tareas Periódicas

Para programar tareas recurrentes, defina beat_schedule en la configuración de Celery. Ejemplo para ejecutar diariamente a las 9 AM:

from celery.schedules import crontab

app.conf.beat_schedule = {
    'enviar-correo-diario': {
        'task': 'mi_app.tasks.enviar_correo',
        'schedule': crontab(minute=0, hour=9),
    },
}

Consulte la documentación oficial para más opciones de prorgamación.

Ejecución de los Procesos Celery

Para tareas asincrónicas solo se necesita el worker; para tareas periódicas se requiere además el beat.

Iniciar el worker:

celery -A mi_proyecto worker --loglevel=info --detach --pidfile=worker.pid --logfile=worker.log

Iniciar el beat:

celery -A mi_proyecto beat --loglevel=info --detach --pidfile=beat.pid --logfile=beat.log

Estos comandos ejecutan los procesos en segundo plano, generando archivos PID y logs.

Detener los Procesos

Para finalizar los procesos, use los archivos PID:

kill -TERM $(cat worker.pid)
kill -TERM $(cat beat.pid)

Esto envía una señal de terminación para una parada ordenada.

Recursos Adicionales

Para más detalles, consulte la documentación oficial de Celery:

Etiquetas: Django Celery Redis async-tasks scheduled-tasks

Publicado el 6-3 03:23