J'essaie de démarrer un serveur de serveur Celery à partir d'une ligne de commande:
celery -A tasks worker --loglevel=info
Le code dans tasks.py:
import os
os.environ[ 'Django_SETTINGS_MODULE' ] = "proj.settings"
from celery import task
@task()
def add_photos_task( lad_id ):
...
Je reçois la prochaine erreur:
Traceback (most recent call last):
File "/usr/local/bin/celery", line 8, in <module>
load_entry_point('celery==3.0.12', 'console_scripts', 'celery')()
File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/__main__.py", line 14, in main
main()
File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/celery.py", line 946, in main
cmd.execute_from_commandline(argv)
File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/celery.py", line 890, in execute_from_commandline
super(CeleryCommand, self).execute_from_commandline(argv)))
File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/base.py", line 177, in execute_from_commandline
argv = self.setup_app_from_commandline(argv)
File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/base.py", line 295, in setup_app_from_commandline
self.app = self.find_app(app)
File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/base.py", line 313, in find_app
return sym.celery
AttributeError: 'module' object has no attribute 'celery'
Est-ce que quelqu'un sait pourquoi l'attribut 'céleri' ne peut pas être trouvé? Merci pour l'aide.
Le système d'exploitation est Linux Debian 5.
Modifier . Peut être l'indice. Quelqu'un pourrait-il m'expliquer le commentaire suivant à une fonction (pourquoi nous devons être sûrs qu'elle trouve des modules dans le répertoire actuel)?
# from celery/utils/imports.py
def import_from_cwd(module, imp=None, package=None):
"""Import module, but make sure it finds modules
located in the current directory.
Modules located in the current directory has
precedence over modules located in `sys.path`.
"""
if imp is None:
imp = importlib.import_module
with cwd_in_path():
return imp(module, package=package)
J'ai oublié de créer un objet céleri dans tasks.py:
from celery import Celery
from celery import task
celery = Celery('tasks', broker='amqp://guest@localhost//') #!
import os
os.environ[ 'Django_SETTINGS_MODULE' ] = "proj.settings"
@task()
def add_photos_task( lad_id ):
...
Après cela, nous pourrions normalement commencer des tâches:
celery -A tasks worker --loglevel=info
Le céleri utilise le fichier celery
pour enregistrer la configuration de votre application. Vous ne pouvez pas simplement donner un fichier python avec des tâches et démarrer le céleri. Vous devez définir le fichier celery
(pour Celery> 3.0; c'était auparavant celeryconfig.py
) ..
celeryd --app app.celery -l info
Cet exemple montre comment démarrer le céleri avec le fichier de configuration à app/celery.py
Voici un exemple de fichier de céleri: https://github.com/Kami/libcloud-sandbox/blob/master/celeryconfig.py
Si vous recevez le même message d'erreur pour une raison apparemment différente, notez que si l'une des importations de votre fichier d'initialisation échoue, votre application déclenche cette AttributeError
totalement ambiguë plutôt que l'exception qui l'a initialement provoquée.
Lorsque vous exécutez celery -A tasks worker --loglevel=info
, votre application de céleri devrait être exposée dans le module tasks
. Il ne devrait pas être encapsulé dans une fonction ou dans une instruction if
qui.
Si vous make_celery
dans un autre fichier, vous devez importer l'application de céleri dans votre fichier que vous transmettez au céleri.
Essayez de commencer le céleri:
celeryd --config=my_app.my_config --loglevel=INFO --purge -Q my_queue
Il y a le prochain script dans mon tasks.py
:
@task(name="my_queue", routing_key="my_queue")
def add_photos_task( lad_id ):
Il y a le prochain script dans my_config.py
:
CELERY_IMPORTS = \
(
"my_app.tasks",
)
CELERY_ROUTES = \
{
"my_queue":
{
"queue": "my_queue"
},
}
CELERY_QUEUES = \
{
"my_queue":
{
"exchange": "my_app",
"exchange_type": "direct",
"binding_key": "my_queue"
},
}
celery = Celery(broker='amqp://guest@localhost//')
Mon problème était que j'ai mis la variable celery
dans une fonction principale:
if __== '__main__': # Remove this row
app = Flask(__name__)
celery = make_celery(app)
quand il devrait être mis à l'extérieur.