web-dev-qa-db-fra.com

Dans céleri 3.1, faire Django tâche périodique

Les choses ont trop changé dans Django, donc je ne peux pas utiliser la 3.1. Je ai besoin d'aide.

J'ai lu sur faire une tâche dans Django , et lu Tâches périodiques document. Mais je ne sais pas comment faire des tâches périodiques dans Django. Je pense que c'est à cause de mon anglais bas niveau ..

Dans l'ancienne version de Celery, j'ai importé djcelery & crontab et défini CELERYBEAT_SCHEDULE dans settings.py , et excuté par manage.py .

Mais il semble que je ne puisse plus exécuter le démon céleri de cette façon. Que dois-je mettre CELERYBEAT_SCHEDULE? Dans Django dans les documents, ils définissent os.environ.setdefault('Django_SETTINGS_MODULE', 'proj.settings') dans proj/proj/celery.py . (1) Donc, définir le céleri-battement dans settings.py (comme avant) est correct?

(2) Si vous le pouvez, un petit exemple de création de tâche périodique dans Django sera très utile. Lorsque je lisais des tutoriels, la partie la plus déroutante était Fichier Chemin . Si vous ne voulez pas fournir un exemple complet, j'apprécierai vraiment si vous expliquez où je devrais faire les tâches, définir le rythme et exécuter le démon.

Merci d'avoir lu.

30
margincall

Je suppose que vous avez déjà lu la section Django des documents, mais l'avez-vous vu exemple de projet ?

Il n'utilise pas le planificateur mais si vous l'ajoutez à settings.py:

from __future__ import absolute_import

from celery.schedules import crontab


CELERYBEAT_SCHEDULE = {
    # crontab(hour=0, minute=0, day_of_week='saturday')
    'schedule-name': {  # example: 'file-backup' 
        'task': 'some_Django_app.tasks....',  # example: 'files.tasks.cleanup' 
        'schedule': crontab(...)
    },
}

# if you want to place the schedule file relative to your project or something:
CELERYBEAT_SCHEDULE_FILENAME = "some/path/and/filename"

Maintenant pour les commandes, oubliez manage.py, Tapez simplement celery directement:

-B Permet de battre le céleri comme toujours.

-A Spécifie le nom de l'application céleri. Notez cette ligne dans le celery.py de l'exemple de projet: app = Celery('proj')

celery -A proj worker -B -l info

'Django-celery' n'est pas non requis , installez-le UNIQUEMENT si vous avez besoin de gérer le planning à partir de l'admin, ou si vous souhaitez stocker les résultats des tâches dans la DB via l'ORM de Django:

INSTALLED_APPS += ('djcelery',)

# store schedule in the DB:
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
60
Adrián

Vous pouvez utiliser l'application Django-céleri: https://pypi.python.org/pypi/Django-celery

Installation :

pip install Django-celery

Pour activer Django-céleri pour votre projet, vous devez ajouter djcelery à INSTALLED_APPS:

INSTALLED_APPS += ("djcelery", )
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"

puis ajoutez les lignes suivantes à votre settings.py:

import djcelery
djcelery.setup_loader()

[~ # ~] utilisation [~ # ~]

Sur linux, vous pouvez exécuter le travailleur avec céleri-beat comme ceci:

python manage.py celeryd worker --loglevel=DEBUG  -E -B -c 1
python manage.py help celeryd #to find out the args meaning

Vous aimerez également surveiller les tâches dans Django admin. Pour activer la surveillance des meubles, vous devrez exécuter celerycam:

python /var/www/gorod/manage.py celerycam

Pour effectuer une tâche périodique, vous pouvez utiliser celery.decorators.periodic_task.

# myapp/tasks.py
import datetime
import celery

@celery.decorators.periodic_task(run_every=datetime.timedelta(minutes=5))
def myfunc():
    print 'periodic_task'

Ou utiliser

# settings.py
CELERYBEAT_SCHEDULE = {
    'add-every-30-seconds': {
        'task': 'tasks.add',
        'schedule': timedelta(seconds=30),
        'args': (16, 16)
    },
}
23