es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

django-celery-beat genera spam debido a tareas

Estoy utilizando django-celery-beat para algunas tareas por hora/día. Sin embargo, un comportamiento extraño me ha dejado perplejo sobre qué hacer.

Estoy creando una tarea utilizando este fragmento de código:

periodic_task = apps.get_model('django_celery_beat', 'PeriodicTask')
interval_schedule = apps.get_model('django_celery_beat', 'IntervalSchedule')

schedule, _ = interval_schedule.objects.get_or_create(every=2, period='hours')

periodic_task.objects.update_or_create(
    task=TASK,
    defaults={'name': '<descripción de="" la="" tarea="">', 'interval': schedule},
)

donde TAREA es una cadena que apunta a esta tarea:

@app.task(ignore_result=True)
def tarea():
    <cosas por="" hacer="">
    pass

En el código puedes ver que estoy utilizando un intervalo de 2 horas, y una vez que inicié el beat con celery -A [nombre-del-proyecto] beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler, no aparece ningún error (no sé si realmente funcione, 2 horas es bastante tiempo). Sin embargo, cuando cambio el intervalo a 1 hora, aparece lo siguiente en exceso:

[2021-12-21 15:32:45,333: INFO/MainProcess] Tarea app.tasks.tarea[6c0343b0-faf1-4eae-a8e0-721c862120a9] realizada en 0.0s: None
[2021-12-21 15:32:45,336: INFO/MainProcess] Planificador: Enviando tarea pendiente <descripción de="" la="" tarea=""> (app.tasks.tarea)

y luego continúa eternamente, solo se puede detener con Ctrl+C.

Tengo instalado el complemento RabbitMQ Management y desde la interfaz de usuario todo parece estar bien, sin colas, nada sin confirmar, etc. ¿Algún indicio de qué podría estar causando esto?

Incluso después de purgar la cola, todavía sucede (con celery -A [nombre-del-proyecto] purge).</descripción></descripción>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que la tarea se está ejecutando correctamente pero el programador sigue enviando la misma tarea repetidamente, causando el spam de mensajes de registro.

    Una posible razón para este comportamiento podría ser que la tarea no se está marcando como completa en la base de datos de Celery Beat, lo que hace que el programador siga intentando ejecutarla.

    Para verificar esto, puedes verificar la tabla django_celery_beat_periodictask en tu base de datos para ver si la tarea está marcada como completa (los campos last_run_at y total_run_count deben estar actualizados).

    Si la tarea no se está marcando como completa, asegúrate de tener la opción ignore_result=True establecida en el decorador de la tarea para evitar que se utilice el resultado de la base de datos.

    Alternativamente, puedes intentar usar la configuración CELERY_TASK_ACKS_LATE en tu configuración de Celery para asegurarte de que las tareas solo se marquen como completadas después de haber sido ejecutadas con éxito.

    Si ninguna de estas soluciones funciona, puede ser útil proporcionar más información sobre tu configuración de Celery y django-celery-beat, ya que puede haber un problema subyacente que cause este comportamiento.

Comments are closed.