J'essaye d'exécuter l' exemple de la documentation Celery.
Je cours: celeryd --loglevel=INFO
/usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python.
"is available to Python." % (configname, )))
[2012-03-19 04:26:34,899: WARNING/MainProcess]
-------------- celery@ubuntu v2.5.1
---- **** -----
--- * *** * -- [Configuration]
-- * - **** --- . broker: amqp://guest@localhost:5672//
- ** ---------- . loader: celery.loaders.default.Loader
- ** ---------- . logfile: [stderr]@INFO
- ** ---------- . concurrency: 4
- ** ---------- . events: OFF
- *** --- * --- . beat: OFF
-- ******* ----
--- ***** ----- [Queues]
-------------- . celery: exchange:celery (direct) binding:celery
tâches.py:
# -*- coding: utf-8 -*-
from celery.task import task
@task
def add(x, y):
return x + y
run_task.py:
# -*- coding: utf-8 -*-
from tasks import add
result = add.delay(4, 4)
print (result)
print (result.ready())
print (result.get())
Dans le même dossier celeryconfig.py:
CELERY_IMPORTS = ("tasks", )
CELERY_RESULT_BACKEND = "amqp"
BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_TASK_RESULT_EXPIRES = 300
Lorsque j'exécute "run_task.py":
sur console python
eb503f77-b5fc-44e2-ac0b-91ce6ddbf153
False
erreurs sur le serveur celeryd
[2012-03-19 04:34:14,913: ERROR/MainProcess] Received unregistered task of type 'tasks.add'.
The message has been ignored and discarded.
Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.
The full contents of the message body was:
{'retries': 0, 'task': 'tasks.add', 'utc': False, 'args': (4, 4), 'expires': None, 'eta': None, 'kwargs': {}, 'id': '841bc21f-8124-436b-92f1-e3b62cafdfe7'}
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/celery/worker/consumer.py", line 444, in receive_message
self.strategies[name](message, body, message.ack_log_error)
KeyError: 'tasks.add'
Veuillez expliquer quel est le problème.
CELERY_IMPORTS = ("tasks", )
Réponses:
Vous pouvez voir la liste actuelle des tâches enregistrées dans la
celery.registry.TaskRegistry
classe. Peut-être que votre celeryconfig (dans le répertoire courant) n'est pas dans,PYTHONPATH
donc céleri ne peut pas le trouver et revient aux valeurs par défaut. Spécifiez-le simplement explicitement lors du démarrage du céleri.Vous pouvez également définir
--loglevel=DEBUG
et vous devriez probablement voir le problème immédiatement.la source
--loglevel=DEBUG
, il y a eu une erreur de syntaxe dans ma tâche.celery worker
par exemple pourDjango
comme çacelery --app=your_app.celery worker --loglevel=info
celery.registry.tasks
pour voir une liste de toutes mes tâches en cours. Vous pouvez toujours vérifier en exécutantdir(celery.registry)
.--loglevel=DEBUG
de mon côté aussiJe pense que vous devez redémarrer le serveur de travail. Je rencontre le même problème et je le résolve en redémarrant.
la source
celery inspect registered
--autoreload
qui redémarrera le céleri à chaque changement de code temporel.J'ai eu le même problème: la raison en
"Received unregistered task of type.."
était que le service celeryd n'a pas trouvé et enregistré les tâches au démarrage du service (btw leur liste est visible lorsque vous démarrez./manage.py celeryd --loglevel=info
).Ces tâches doivent être déclarées dans le
CELERY_IMPORTS = ("tasks", )
fichier de paramètres.Si vous avez un
celery_settings.py
fichier spécial , il doit être déclaré au démarrage du service--settings=celery_settings.py
celeryd comme l'a écrit digivampire.la source
Que vous utilisiez
CELERY_IMPORTS
ouautodiscover_tasks
, le point important est que les tâches peuvent être trouvées et que le nom des tâches enregistrées dans Celery doit correspondre aux noms que les travailleurs tentent de récupérer.Lorsque vous lancez le céleri, par exemple
celery worker -A project --loglevel=DEBUG
, vous devriez voir le nom des tâches. Par exemple, si j'ai unedebug_task
tâche dans moncelery.py
.Si vous ne pouvez pas voir vos tâches dans la liste, s'il vous plaît vérifier vos importations de configuration de céleri les tâches correctement, que ce soit dans
--setting
,--config
,celeryconfig
ouconfig_from_object
.Si vous utilisez un battement de céleri, assurez-vous que le nom de la tâche,, que
task
vous utilisezCELERYBEAT_SCHEDULE
correspond au nom de la liste des tâches de céleri.la source
@task(name='check_periodically')
il devrait correspondre à ce que vous avez mis dans le calendrier de battement, c'est-à-dire:CELERY_BEAT_SCHEDULE = { 'check_periodically': { 'task': 'check_periodically', 'schedule': timedelta(seconds=1) }
J'ai aussi eu le même problème; J'ai ajouté
dans mon
celeryconfig.py
dossier pour le résoudre.la source
CELERY_IMPORTS = ['my_module']
please include = ['proj.tasks'] Vous devez aller dans le répertoire supérieur, puis exécuter ceci
ne pas
dans votre entrée celeryconfig.py importations = ("path.ptah.tasks",)
s'il vous plaît dans un autre module invoquer la tâche !!!!!!!!
la source
include
paramètre doit être ajouté si vous utilisez des importations relatives. J'ai résolu mon problème en l'ajoutantplease in other module invoke task!!!!!!!!
. Ça m'a aidé.L'utilisation de --settings n'a pas fonctionné pour moi. J'ai dû utiliser ce qui suit pour que tout fonctionne:
Voici le fichier celeryconfig qui a le CELERY_IMPORTS ajouté:
Ma configuration était un peu plus délicate car j'utilise un superviseur pour lancer le céleri en tant que démon.
la source
Pour moi, cette erreur a été résolue en s'assurant que l'application contenant les tâches était incluse dans le paramètre INSTALLED_APPS de django.
la source
J'ai eu ce problème mystérieusement survenu lorsque j'ai ajouté une gestion du signal à mon application django. Ce faisant, j'ai converti l'application pour qu'elle utilise un AppConfig, ce qui signifie qu'au lieu de simplement lire comme
'booking
'inINSTALLED_APPS
, il a lu'booking.app.BookingConfig'
.Celery ne comprend pas ce que cela signifie, alors j'ai ajouté,
INSTALLED_APPS_WITH_APPCONFIGS = ('booking',)
à mes paramètres django, et modifié moncelery.py
depuisà
la source
Ce qui a fonctionné pour moi, a été d'ajouter un nom explicite au décorateur de tâches de céleri. J'ai changé ma déclaration de tâche de
@app.tasks
à@app.tasks(name='module.submodule.task')
Voici un exemple
la source
J'ai eu le même problème lors de l'exécution des tâches de Celery Beat. Celery n'aime pas les importations relatives, donc dans mon
celeryconfig.py
, j'ai dû définir explicitement le nom complet du package:la source
Ceci, étrangement, peut aussi être dû à un paquet manquant. Exécutez pip pour installer tous les packages nécessaires:
pip install -r requirements.txt
autodiscover_tasks
ne prenait pas en charge les tâches qui utilisaient des packages manquants.la source
Je n'ai eu aucun problème avec Django . Mais j'ai rencontré cela lorsque j'utilisais Flask . La solution était de définir l'option de configuration.
celery worker -A app.celery --loglevel=DEBUG --config=settings
tandis qu'avec Django, je viens d'avoir:
python manage.py celery worker -c 2 --loglevel=info
la source
J'ai également rencontré ce problème, mais ce n'est pas tout à fait le même, donc juste pour info. Les mises à niveau récentes provoquent ce message d'erreur en raison de cette syntaxe de décorateur.
ERROR/MainProcess] Received unregistered task of type 'my_server_check'.
@task('my_server_check')
Doit être changé pour juste
@task()
Aucune idée pourquoi.
la source
Si vous utilisez la configuration des applications dans des applications installées comme celle-ci:
Ensuite, dans votre application de configuration, importez la tâche dans la méthode prête comme ceci:
la source
Si vous rencontrez ce type d'erreur, il existe un certain nombre de causes possibles, mais la solution que j'ai trouvée était que mon fichier de configuration celeryd dans / etc / defaults / celeryd était configuré pour une utilisation standard, pas pour mon projet django spécifique. Dès que je l'ai converti au format spécifié dans les documents sur le céleri , tout allait bien.
la source
La solution pour moi d'ajouter cette ligne à / etc / default / celeryd
Parce que quand j'exécute ces commandes:
Seule la dernière commande affichait des noms de tâches.
J'ai également essayé d'ajouter la ligne CELERY_APP / etc / default / celeryd mais cela n'a pas fonctionné non plus.
la source
J'ai eu le problème avec les classes PeriodicTask dans django-celery, alors que leurs noms apparaissaient bien lors du démarrage du céleri à chaque exécution déclenchée:
KeyError: u'my_app.tasks.run '
Ma tâche était une classe nommée «CleanUp», pas seulement une méthode appelée «run».
Lorsque j'ai vérifié la table 'djcelery_periodictask', j'ai vu des entrées obsolètes et leur suppression a résolu le problème.
la source
Juste pour ajouter mes deux cents pour mon cas avec cette erreur ...
Mon chemin est
/vagrant/devops/test
avecapp.py
et__init__.py
dedans.Quand je cours
cd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=info
, j'obtiens cette erreur.Mais quand je le lance comme si
cd /vagrant/devops/test && celery worker -A app.celery --loglevel=info
tout allait bien.la source
J'ai constaté que l'un de nos programmeurs a ajouté la ligne suivante à l'une des importations:
Cela a amené l'ouvrier Celery à changer son répertoire de travail du répertoire de travail par défaut des projets (où il pouvait trouver les tâches) vers un autre répertoire (où il ne pouvait pas trouver les tâches).
Après avoir supprimé cette ligne de code, toutes les tâches ont été trouvées et enregistrées.
la source
Le céleri ne prend pas en charge les importations relatives, donc dans mon celeryconfig.py, vous avez besoin d'une importation absolue.
la source
Un élément supplémentaire à une liste vraiment utile.
J'ai trouvé Celery impitoyable en ce qui concerne les erreurs dans les tâches (ou du moins je n'ai pas été en mesure de retracer les entrées de journal appropriées) et il ne les enregistre pas. J'ai eu un certain nombre de problèmes avec l'exécution de Celery en tant que service, qui étaient principalement liés aux autorisations.
La dernière concernant les autorisations d'écriture dans un fichier journal. Je n'ai eu aucun problème de développement ou d'exécution de céleri sur la ligne de commande, mais le service a signalé la tâche comme non enregistrée.
J'avais besoin de modifier les autorisations du dossier de journal pour permettre au service d'y écrire.
la source
Mes 2 cents
J'obtenais cela dans une image de docker en utilisant alpin. Les paramètres de django référencés
/dev/log
pour la journalisation dans syslog. L'application django et le céleri worker étaient tous deux basés sur la même image. Le point d'entrée de l'image de l'application django se lancaitsyslogd
au démarrage, mais celui du céleri ne l'était pas. Cela faisait./manage.py shell
échouer les choses parce qu'il n'y en aurait pas/dev/log
. Le céleri-ouvrier n'échouait pas. Au lieu de cela, il ignorait silencieusement le reste du lancement de l'application, qui comprenait le chargement d'shared_task
entrées à partir d'applications dans le projet djangola source
Dans mon cas, l'erreur était due au fait qu'un conteneur avait créé des fichiers dans un dossier qui étaient montés sur le système de fichiers hôte avec docker-compose.
Je devais simplement supprimer les fichiers créés par le conteneur sur le système hôte et j'ai pu relancer mon projet.
(J'ai dû utiliser sudo car les fichiers appartenaient à l'utilisateur root)
Version Docker: 18.03.1
la source
Si vous utilisez
autodiscover_tasks
, assurez-vous que votrefunctions
inscription reste dans letasks.py
fichier, pas dans un autre fichier. Ou le céleri ne peut pas trouver lefunctions
vous souhaitez enregistrer.Utilisation
app.register_task
fera également l'affaire, mais semble un peu naïf.Veuillez vous référer à cette spécification officielle de
autodiscover_tasks
.la source
Écrivez le chemin correct vers les tâches de fichier
}
la source
lors de l'exécution du céleri avec la commande "céleri -A conf worker -l info", toutes les tâches ont été répertoriées dans le journal comme je l'avais. conf.celry.debug_task J'obtenais l'erreur parce que je ne donnais pas ce chemin exact de tâche. Veuillez donc revérifier cela en copiant et en collant l'identifiant exact de la tâche.
la source
la source
La réponse à votre problème réside dans LA PREMIÈRE LIGNE du résultat que vous avez fourni dans votre question:
/usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python. "is available to Python." % (configname, )))
. Sans la bonne configuration, Celery ne peut rien faire.La raison pour laquelle il ne trouve pas le celeryconfig est très probablement qu'il ne se trouve pas dans votre PYTHONPATH.
la source
J'ai résolu mon problème, ma 'tâche' est sous un paquet python nommé 'celery_task' , quand je quitte ce paquet et exécute la commande
celery worker -A celery_task.task --loglevel=info
. Ça marche.la source