web-dev-qa-db-fra.com

Céleri avec RabbitMQ: AttributeError: l'objet 'DisabledBackend' n'a pas d'attribut '_get_task_meta_for'

J'exécute le Premiers pas avec le tutoriel sur le céleri .

Nous définissons la tâche suivante:

from celery import Celery

app = Celery('tasks', broker='amqp://guest@localhost//')

@app.task
def add(x, y):
    return x + y

Appelez-le ensuite:

>>> from tasks import add
>>> add.delay(4, 4)

Mais j'obtiens l'erreur suivante:

AttributeError: 'DisabledBackend' object has no attribute '_get_task_meta_for'

J'exécute à la fois le travailleur céleri et le serveur rabbit-mq. Assez étrangement, le travailleur du céleri rapporte que la tâche a réussi:

[2014-04-22 19:12:03,608: INFO/MainProcess] Task test_celery.add[168c7d96-e41a-41c9-80f5-50b24dcaff73] succeeded in 0.000435483998444s: 19 

Pourquoi ça ne marche pas?

55
Casebash

Continuez simplement à lire le tutoriel. Il sera expliqué dans le chapitre Conserver les résultats .

Pour démarrer Celery, vous devez fournir uniquement le paramètre de courtier, qui est requis pour envoyer des messages sur les tâches. Si vous souhaitez récupérer des informations sur l'état et les résultats renvoyés par les tâches terminées, vous devez définir le paramètre backend. Vous pouvez trouver la liste complète avec une description dans Documents de configuration: CELERY_RESULT_BACKEND .

44
daniula

Je suggère de jeter un œil à: http://www.cnblogs.com/fangwenyu/p/3625830.html

Là, vous verrez qu'au lieu de

app = Celery('tasks', broker='amqp://guest@localhost//')

tu devrais écrire

app = Celery('tasks', backend='amqp', broker='amqp://guest@localhost//')

Ça y est.

36
TorokLev

Au cas où quelqu'un aurait fait la même erreur facile que moi: le didacticiel ne le dit pas explicitement, mais la ligne

app = Celery('tasks', backend='rpc://', broker='amqp://')

est une modification de la ligne dans votre tasks.py fichier. Le mien se lit maintenant:

app = Celery('tasks', backend='rpc://', broker='amqp://guest@localhost//')

Lorsque j'exécute python à partir de la ligne de commande, j'obtiens:

$ python
>>> from tasks import add
>>> result = add.delay(4,50)
>>> result.ready()
>>> False

Tous les tutoriels doivent être faciles à suivre, même lorsqu'ils sont un peu ivres. Jusqu'à présent, celui-ci n'atteint pas cette barre.

20
Diederik

Ce qui n'est pas clair dans le tutoriel, c'est que le module tasks.py doit être édité pour que vous changiez la ligne:

app = Celery('tasks', broker='pyamqp://guest@localhost//')

pour inclure le backend de résultat RPC:

app = Celery('tasks', backend='rpc://', broker='pyamqp://')

Une fois fait, Ctrl + C le processus de travail du céleri et redémarrez-le:

celery -A tasks worker --loglevel=info

Le didacticiel est déroutant en ce que nous supposons que la création de l'objet d'application se fait dans la session de test du client, ce qui n'est pas le cas.

1
Chris Foote

dans votre répertoire de projet, recherchez le fichier de paramètres.

puis: Sudo vim settings.py copier/coller dans settings.py: CELERY_RESULT_BACKEND = 'djcelery.backends.database: DatabaseBackend'

remarque: c'est si vous utilisez Django-celery comme backend pour stocker les messages dans la file d'attente.

1
Carlisle