Pourquoi Celery travaille-t-il dans le shell Python, mais pas dans mes vues Django? (problème d'importation)
J'ai installé le Céleri (dernière version stable.)
J'ai un répertoire appelé /home/myuser/fable/jobs
. À l'intérieur de ce répertoire, j'ai un fichier appelé tasks.py:
from celery.decorators import task
from celery.task import Task
class Submitter(Task):
def run(self, post, **kwargs):
return "Yes, it works!!!!!!"
À l'intérieur de ce répertoire, j'ai aussi un fichier appelé celeryconfig.py:
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "abc"
BROKER_PASSWORD = "xyz"
BROKER_VHOST = "fablemq"
CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("tasks", )
Dans mon /etc/profile
je les ai mis que mon PYTHONPATH:
PYTHONPATH=/home/myuser/fable:/home/myuser/fable/jobs
Donc, je lance mon Céleri travailleur à l'aide de la console ($ celeryd --loglevel=INFO
), et je l'essayer.
J'ai ouvert la console Python et importer les tâches. Ensuite, je lance le Demandeur.
>>> import fable.jobs.tasks as tasks
>>> s = tasks.Submitter()
>>> s.delay("abc")
<AsyncResult: d70d9732-fb07-4cca-82be-d7912124a987>
Tout fonctionne, comme vous pouvez le voir dans ma console
[2011-01-09 17:30:05,766: INFO/MainProcess] Task tasks.Submitter[d70d9732-fb07-4cca-82be-d7912124a987] succeeded in 0.0398268699646s:
Mais quand je vais dans mon Django views.py et exécuter exactement 3 lignes de code comme ci-dessus, j'obtiens ceci:
[2011-01-09 17:25:20,298: ERROR/MainProcess] Unknown task ignored: "Task of kind 'fable.jobs.tasks.Submitter' is not registered, please make sure it's imported.": {'retries': 0, 'task': 'fable.jobs.tasks.Submitter', 'args': ('abc',), 'expires': None, 'eta': None, 'kwargs': {}, 'id': 'eb5c65b4-f352-45c6-96f1-05d3a5329d53'}
Traceback (most recent call last):
File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/listener.py", line 321, in receive_message
eventer=self.event_dispatcher)
File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/job.py", line 299, in from_message
eta=eta, expires=expires)
File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/job.py", line 243, in __init__
self.task = tasks[self.task_name]
File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/registry.py", line 63, in __getitem__
raise self.NotRegistered(str(exc))
NotRegistered: "Task of kind 'fable.jobs.tasks.Submitter' is not registered, please make sure it's imported."
C'est bizarre, parce que le celeryd client ne montrer qu'il est enregistré, lorsque je le lance.
[2011-01-09 17:38:27,446: WARNING/MainProcess]
Configuration ->
. broker -> amqp://GOGOme@localhost:5672/fablemq
. queues ->
. celery -> exchange:celery (direct) binding:celery
. concurrency -> 1
. loader -> celery.loaders.default.Loader
. logfile -> [stderr]@INFO
. events -> OFF
. beat -> OFF
. tasks ->
. tasks.Decayer
. tasks.Submitter
Quelqu'un peut-il aider?
source d'informationauteur TIMEX
Vous devez vous connecter pour publier un commentaire.
Je crois que votre tasks.py le fichier doit être dans un django app (c'est inscrit dans settings.py) afin de pouvoir être importés. Sinon, vous pouvez essayer de l'importer les tâches à partir d'un
__init__.py
fichier dans votre projet principal ou de l'un des apps.Aussi essayer de démarrer celeryd de manage.py:
(
-E
et-B
peut ou peut ne pas être nécessaire, mais c'est ce que j'utilise).C'est ce que j'ai fait qui a finalement travaillé
dans Settings.py j'ai ajouté
sous myapp dossier que j'ai créé un fichier appelé jobs.py
Puis a couru à partir de la ligne de commande: python manage.py celeryd -l info
dans un autre shell, j'ai couru python manage.py shell, puis
et la j'obtiens:
16
Le point important est que vous devez réexécuter les deux interfaces de commande, lorsque vous ajoutez une nouvelle fonction. Vous devez inscrire le nom à la fois sur le client et le et sur le serveur.
🙂
Voir le Nommage Automatique et Relative des Importations, dans les docs:
http://celeryq.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports
Les tâches nom est "tâches".Demandeur" (comme indiqué dans le celeryd de sortie),
mais l'importation de la tâche comme "fable".les emplois.les tâches.Demandeur"
Je suppose que la meilleure solution ici est de savoir si le travailleur y voit également "fable".les emplois.les tâches.Demandeur",
il fait plus de sens à partir d'une application de point de vue.