Question

Je veux avoir une tâche qui exécutera toutes les 5 minutes, mais il attendra la dernière exécution à la fin, puis commencer à compter ces 5 minutes. (De cette façon, je peux aussi être sûr qu'il n'y a qu'une seule tâche en cours d'exécution) J'ai trouvé le moyen le plus simple est d'exécuter django manage.py shell application et exécutez ceci:

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

mais pour chaque tâche que je veux exécuter cette façon, je dois courir propre shell de, est-il un moyen facile de le faire? Peut-être quelques-uns ot roi coutume ordonnanceur céleri django?

Était-ce utile?

La solution

Il suffit de spécifier dans le céleri tâche de sorcière que vous voulez conf exécuter périodiquement et avec quel intervalle.

Exemple: Exécuter la tâche tasks.add toutes les 30 secondes

from datetime import timedelta

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

Rappelez-vous que vous devez exécuter le céleri en mode beat avec l'option -B

manage celeryd -B

Vous pouvez également utiliser le style crontab au lieu d'intervalle de temps, la caisse ceci:

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

Si vous utilisez django-céleri rappelez-vous que vous pouvez également utiliser tha django db comme planificateur des tâches périodiques, de cette façon, vous pouvez facilement ajouter creux le panneau d'administration django-céleri nouvelles tâches périodiques. Pour le faire, vous devez définir le planificateur de celerybeat dans settings.py de cette façon

CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"

Autres conseils

Wow il est incroyable de voir comment personne ne comprend la question de cette personne. Ils demandent pas l'exécution de tâches périodiquement, mais comment faire en sorte que Céleri ne fonctionne pas deux instances de la même tâche simultanément. Je ne pense pas qu'il y ait un moyen de le faire avec Céleri directement, mais ce que vous pouvez faire est d'avoir l'une des tâches acquérir un droit de blocage quand il commence, et si elle échoue, d'essayer à nouveau en quelques secondes (en utilisant retry) . La tâche libérerait le droit de blocage avant de revenir; vous pouvez faire expirer automatiquement le verrouillage après quelques minutes si elle se bloque toujours ou temporairement.

Pour la serrure, vous pouvez probablement utiliser votre base de données ou quelque chose comme Redis.

Vous pouvez être intéressé par cette méthode plus simple qui ne nécessite aucune modification à un céleri conf.

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

Pour développer @ poste de MauroRocco, de http: // docs.celeryproject.org/en/v2.2.4/userguide/periodic-tasks.html

L'utilisation d'un timedelta pour le calendrier signifie que la tâche sera exécutée 30 secondes après le démarrage celerybeat, puis toutes les 30 secondes après la dernière course. Un crontab programme existe aussi, voir la section sur les horaires crontab.

Donc, ce sera en effet d'atteindre l'objectif que vous voulez.

En raison de celery.decorators déconseillés, vous pouvez utiliser periodic_task décorateur comme ça:

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

Ajoutez cette tâche à une file d'attente séparée, puis utilisez un travailleur séparé pour cette file d'attente avec l'option 1 jeu concurrency.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top