Version: | 2.7.0 |
---|---|
Internet : | http://django-celery-beat.readthedocs.io/ |
Télécharger: | http://pypi.python.org/pypi/django-celery-beat |
Source: | http://github.com/celery/django-celery-beat |
Mots-clés : | django, céleri, battre, tâche périodique, cron, planification |
Cette extension vous permet de stocker le planning des tâches périodiques dans la base de données.
Les tâches périodiques peuvent être gérées depuis l'interface d'administration de Django, où vous pouvez créer, modifier et supprimer des tâches périodiques et à quelle fréquence elles doivent s'exécuter.
Les instructions d'utilisation et d'installation de cette extension sont disponibles dans la documentation Celery.
Avertissement
Si vous modifiez le paramètre Django TIME_ZONE
votre planification de tâches périodiques sera toujours basée sur l'ancien fuseau horaire.
Pour résoudre ce problème, vous devrez réinitialiser la « dernière durée d'exécution » pour chaque tâche périodique :
>> > from django_celery_beat . models import PeriodicTask , PeriodicTasks
>> > PeriodicTask . objects . all (). update ( last_run_at = None )
>> > PeriodicTasks . update_changed ()
Note
Cela réinitialisera l'état comme si les tâches périodiques n'avaient jamais été exécutées auparavant.
django_celery_beat.models.PeriodicTask
Ce modèle définit une seule tâche périodique à exécuter.
Il doit être associé à un planning qui définit la fréquence d'exécution de la tâche.
django_celery_beat.models.IntervalSchedule
Un programme qui s'exécute à un intervalle spécifique (par exemple toutes les 5 secondes).
django_celery_beat.models.CrontabSchedule
Un planning avec des champs comme les entrées dans cron : minute hour day-of-week day_of_month month_of_year
.
django_celery_beat.models.PeriodicTasks
Ce modèle n'est utilisé que comme index pour suivre les changements d'horaire.
Chaque fois que vous mettez à jour une PeriodicTask
un compteur dans ce tableau est également incrémenté, ce qui indique au service celery beat
de recharger le planning à partir de la base de données.
Si vous mettez à jour des tâches périodiques en masse, vous devrez mettre à jour le compteur manuellement :
>> > from django_celery_beat . models import PeriodicTasks
>> > PeriodicTasks . update_changed ()
Pour créer une tâche périodique s'exécutant à intervalle, vous devez d'abord créer l'objet intervalle :
>> > from django_celery_beat . models import PeriodicTask , IntervalSchedule
# executes every 10 seconds.
>> > schedule , created = IntervalSchedule . objects . get_or_create (
... every = 10 ,
... period = IntervalSchedule . SECONDS ,
... )
C'est tous les champs dont vous avez besoin : un type de période et la fréquence.
Vous pouvez choisir entre un ensemble spécifique de périodes :
IntervalSchedule.DAYS
IntervalSchedule.HOURS
IntervalSchedule.MINUTES
IntervalSchedule.SECONDS
IntervalSchedule.MICROSECONDS
Note
Si plusieurs tâches périodiques s'exécutent toutes les 10 secondes, elles doivent toutes pointer vers le même objet de planification.
Il existe également un « tuple de choix » disponible si vous devez le présenter à l'utilisateur :
>> > IntervalSchedule . PERIOD_CHOICES
Maintenant que nous avons défini l'objet planning, nous pouvons créer l'entrée de tâche périodique :
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... )
Notez qu'il s'agit d'un exemple très basique, vous pouvez également spécifier les arguments et arguments de mots clés utilisés pour exécuter la tâche, la queue
à laquelle l'envoyer [*] et définir une heure d'expiration.
Voici un exemple spécifiant les arguments. Notez comment la sérialisation JSON est requise :
>> > import json
>> > from datetime import datetime , timedelta
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... args = json . dumps ([ 'arg1' , 'arg2' ]),
... kwargs = json . dumps ({
... 'be_careful' : True ,
... }),
... expires = datetime . utcnow () + timedelta ( seconds = 30 )
... )
[*] | vous pouvez également utiliser le routage AMQP de bas niveau à l'aide des champs exchange et routing_key . |
Un planning crontab contient les champs : minute
, hour
, day_of_week
, day_of_month
month_of_year
, donc si vous voulez l'équivalent d'une entrée crontab de 30 * * * *
(exécuter 30 minutes après chaque heure), vous spécifiez :
>> > from django_celery_beat . models import CrontabSchedule , PeriodicTask
>> > schedule , _ = CrontabSchedule . objects . get_or_create (
... minute = '30' ,
... hour = '*' ,
... day_of_week = '*' ,
... day_of_month = '*' ,
... month_of_year = '*' ,
... timezone = zoneinfo . ZoneInfo ( 'Canada/Pacific' )
... )
Le planning crontab est lié à un fuseau horaire spécifique à l'aide du paramètre d'entrée 'timezone'.
Ensuite, pour créer une tâche périodique à l'aide de cette planification, utilisez la même approche que la tâche périodique basée sur des intervalles plus tôt dans ce document, mais au lieu de interval=schedule
, spécifiez crontab=schedule
:
>> > PeriodicTask . objects . create (
... crontab = schedule ,
... name = 'Importing contacts' ,
... task = 'proj.tasks.import_contacts' ,
... )
Vous pouvez utiliser l'indicateur enabled
pour désactiver temporairement une tâche périodique :
>> > periodic_task . enabled = False
>> > periodic_task . save ()
Les tâches périodiques ont encore besoin de « travailleurs » pour les exécuter. Assurez-vous donc que le package Celery par défaut est installé. (S'il n'est pas installé, veuillez suivre les instructions d'installation ici : https://github.com/celery/celery)
Les services Worker et Beat doivent fonctionner en même temps.
Démarrez un service de travail Celery (précisez le nom de votre projet Django) :
$ céleri -A travailleur [nom-du projet] --loglevel=info
En tant que processus distinct, démarrez le service beat (spécifiez le planificateur Django) :
$ céleri -A [nom du projet] beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
OU vous pouvez utiliser le -S (indicateur du planificateur), pour plus d'options, voir celery beat --help
) :
$ céleri -A [nom-du projet] beat -l info -S django
De plus, comme alternative, vous pouvez exécuter les deux étapes ci-dessus (services Worker et Beat) avec une seule commande (recommandée pour l'environnement de développement uniquement ) :
$ céleri -A travailleur [nom-du projet] --beat --scheduler django --loglevel=info
Vous pouvez désormais ajouter et gérer vos tâches périodiques depuis l'interface d'administration de Django.
Vous pouvez installer django-celery-beat soit via le Python Package Index (PyPI), soit à partir des sources.
Pour installer en utilisant pip
:
$ pip install --upgrade django-celery-beat
Téléchargez la dernière version de Django-celery-beat depuis http://pypi.python.org/pypi/django-celery-beat
Vous pouvez l'installer en procédant comme suit :
$ python3 -m venv .venv
$ source .venv/bin/activate
$ pip install --upgrade build pip
$ tar xvfz django-celery-beat-0.0.0.tar.gz
$ cd django-celery-beat-0.0.0
$ python -m build
$ pip install --upgrade .
Après l'installation, ajoutez django_celery_beat
au module de paramètres de Django :
INSTALLED_APPS = [
...,
'django_celery_beat' ,
]
Exécutez les migrations django_celery_beat
en utilisant :
$ python manage.py migrate django_celery_beat
Vous pouvez installer la dernière version principale de Django-celery-beat à l'aide de la commande pip suivante :
$ pip install git+https://github.com/celery/django-celery-beat#egg=django-celery-beat
Pour lancer une copie de développement local de Django-celery-beat avec l'administrateur Django à l'adresse http://127.0.0.1:58000/admin/, exécutez :
$ docker-compose up --build
Connectez-vous en tant qu'utilisateur admin
avec le mot de passe admin
.
Si vous avez un projet naïf en matière de fuseau horaire, vous pouvez définir DJANGO_CELERY_BEAT_TZ_AWARE=False
dans votre fichier de paramètres.
Les responsables de Django-celery-beat et de milliers d'autres packages travaillent avec Tidelift pour fournir un support commercial et une maintenance pour les dépendances open source que vous utilisez pour créer vos applications. Gagnez du temps, réduisez les risques et améliorez la santé du code, tout en rémunérant les responsables des dépendances exactes que vous utilisez. Apprendre encore plus.