Bienvenue sur IndexError.

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

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

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,888 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,888 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.

...