Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Tâches celery non traitées au sein d'une application django

+4 votes

Je suis en train de "migrer" des "management command" django qui se trouvent actuellement dans une crontab, vers une solution "tout" Celery.

j'ai donc défini ce celery.py

from __future__ import absolute_import

import os

from celery import Celery
from celery.schedules import crontab
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'th.settings')

app = Celery('th')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


CELERYBEAT_SCHEDULE = {
    'add-every-hour-cache': {
    'task': 'tasks.read_data',
    'schedule': crontab(minute='*/4'),
    },
    'add-every-hour-publish': {
    'task': 'tasks.publish_data',
    'schedule': crontab(minute='*/5'),
    },
}

ensuite voici mon tasks.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from __future__ import absolute_import

import datetime
import time
import arrow

from celery import shared_task, task

from django.conf import settings
from django_th.services import default_provider
from django_th.models import TriggerService

from django.utils.log import getLogger
# create logger
logger = getLogger('django_th.trigger_happy')


@shared_task
def read_data():
        ....


@shared_task
def publish_data():
        ...

puis je lance la sauce comme ceci :

$ celery -A th worker -l debug &
$ celery -A th beat -l debug &

Et j'ai bien les tâches dans le worker :

[tasks]
  . celery.backend_cleanup
  . celery.chain
  . celery.chord
  . celery.chord_unlock
  . celery.chunks
  . celery.group
  . celery.map
  . celery.starmap
  . django_th.tasks.publish_data
  . django_th.tasks.read_data

Au bout de 5 min le beat me dit :

[2015-06-13 15:31:28,954: DEBUG/MainProcess] beat: Waking up in 5.00 minutes.

et rien de plus

Pourtant mes tâches fonctionnent à merveille via

./manage.py shell
>>> from django_th.tasks import read_data, publish_data
>>> read_data.delay()
<AsyncResult: e67b51e1-0278-4189-814a-9a899c6bb1f6>
>>> [2015-06-13 14:33:22,834: INFO/MainProcess] Received task: django_th.tasks.read_data[e67b51e1-0278-4189-814a-9a899c6bb1f6]
>>> publish_data.delay()
<AsyncResult: b307ab87-5369-4a0f-8f70-06ab074edfe4>
>>> [2015-06-13 14:41:36,104: INFO/MainProcess] Received task: django_th.tasks.publish_data[b307ab87-5369-4a0f-8f70-06ab074edfe4]
demandé 13-Jun-2015 par foxmask (2,892 points)

2 Réponses

+2 votes
 
Meilleure réponse

Dans la crontab on prendra garde de spécifier le module django de son appli
par exemple ceci ne marche pas :

CELERYBEAT_SCHEDULE = {
    'add-read-data': {
        'task': 'tasks.read_data',
        'schedule': crontab(minute='*/27'),
    },
    'add-publish-data': {
        'task': 'tasks.publish_data',
        'schedule': crontab(minute='*/59'),
    },

alors que ceci oui
settings.py

from celery.schedules import crontab

CELERYBEAT_SCHEDULE = {
    'add-read-data': {
        'task': 'django_th.tasks.read_data',
        'schedule': crontab(minute='*/27'),
    },
    'add-publish-data': {
        'task': 'django_th.tasks.publish_data',
        'schedule': crontab(minute='*/59'),
    },
}

celery.py

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_th.settings')

app = Celery('th')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

dans le __init__.py de son app :

from __future__ import absolute_import
from .celery import app as celery_app
répondu 15-Jun-2015 par foxmask (2,892 points)

J'ai publié un billet en rajoutant Supervisor à la stack ;)

+1 vote

Je suis un peu rouillé en django et je ne l'ai pas utilisé avec celery, donc a l'intuition :

CELERYBEAT_SCHEDULE n'est pas vu dans la config par ton app celery.

Peut-être le déplacer dans ton settings.py ou dans un fichier celeryconfig.py

répondu 15-Jun-2015 par jc (2,704 points)

oui c'était ça mais pas que . J'ai mis une reponse complete avec tout le détail.

...