Pregunta

Quiero tener una tarea que se ejecute cada 5 minutos, pero esperará que la última ejecución finalice y luego comience a contar estos 5 minutos. (De esta manera también puedo estar seguro de que solo se ejecuta una tarea) La forma más fácil que encontré es ejecutar la aplicación Django Management.py shell y ejecutar esto:

while True:
    result = task.delay()
    result.wait()
    sleep(5)

Pero para cada tarea que quiero ejecutar de esta manera tengo que ejecutar su propio shell, ¿hay una manera fácil de hacerlo? ¿Puede ser un planificador de apio personalizado de King Custom OT Django?

¿Fue útil?

Solución

Todo lo que necesita es especificar en la tarea de apio con conflicto que desea ejecutar periódicamente y con qué intervalo.

Ejemplo: ejecute las tareas.

from datetime import timedelta

CELERYBEAT_SCHEDULE = {
    "runs-every-30-seconds": {
        "task": "tasks.add",
        "schedule": timedelta(seconds=30),
        "args": (16, 16)
     },
}

Recuerda que tienes que ejecutar apio en modo Beat con la opción -B

manage celeryd -B

También puede usar el estilo crontab en lugar de intervalo de tiempo, consulte esto:

http://ask.github.com/celery/userguide/periodic-tasks.html

Si está utilizando Django-Celery, recuerde que también puede usar Tha Django DB como programador para tareas periódicas, de esta manera puede agregar fácilmente a través del panel de administración de Django-Celery nuevas tareas periódicas. Para hacer eso, debe configurar el planerybeat Scheduler en settings.py de esta manera

CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"

Otros consejos

Vaya, es sorprendente cómo nadie entiende la pregunta de esta persona. No preguntan sobre ejecutar tareas periódicamente, sino cómo garantizar que el apio no ejecute dos instancias de la misma tarea simultáneamente. No creo que haya una manera de hacer esto con el apio directamente, pero lo que puede hacer es hacer que una de las tareas adquiera un bloqueo correctamente cuando comience, y si falla, intentarlo nuevamente en unos segundos (usando volver a intentarlo) . La tarea liberaría el bloqueo justo antes de que regrese; Puede hacer que el bloqueo de bloqueo se expire después de unos minutos si alguna vez se bloquea o se desprende.

Para el bloqueo, probablemente pueda usar su base de datos o algo como Redis.

Es posible que esté interesado en este método más simple que no requiere cambios en un conf.

@celery.decorators.periodic_task(run_every=datetime.timedelta(minutes=5))
def my_task():
    # Insert fun-stuff here

Para expandirse en la publicación de @Maurorocco, desde http://docs.celeryproject.org/en/v2.2.4/userguide/periodic-tasks.html

Usar un Timedelta para el cronograma significa que la tarea se ejecutará 30 segundos después de que comience Celerybeat, y luego cada 30 segundos después de la última carrera. También existe un horario de CRONTAB, consulte la sección sobre crontab horarios.

Así que esto logrará el objetivo que desee.

Debido a los decoradores de apio en desuso, puede usar el decorador periódico de tartamudeo así:

from celery.task.base import periodic_task
from django.utils.timezone import timedelta

@periodic_task(run_every=timedelta(seconds=5))
def my_background_process():
    # insert code

Agregue esa tarea a una cola separada y luego use un trabajador separado para esa cola con la opción de concurrencia establecida en 1.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top