I try to start a Celery worker server from a command line:
celery -A tasks worker --loglevel=info
The code in tasks.py:
import
My problem was that I put the celery
variable inside a main function:
if __name__ == '__main__': # Remove this row
app = Flask(__name__)
celery = make_celery(app)
when it should be put outside.
For anyone who is getting the same error message for an apparently different reason, note that if any of the imports in your initialization file fail, your app will raise this totally ambiguous AttributeError
rather than the exception that initially caused it.
Celery uses celery
file for storing configuration of your app, you can't just give a python file with tasks and start celery.
You should define celery
file ( for Celery>3.0; previously it was celeryconfig.py
)..
celeryd --app app.celery -l info
This example how to start celery with config file at app/celery.py
Here is example of celery file: https://github.com/Kami/libcloud-sandbox/blob/master/celeryconfig.py
Try start celery:
celeryd --config=my_app.my_config --loglevel=INFO --purge -Q my_queue
There is next script in my tasks.py
:
@task(name="my_queue", routing_key="my_queue")
def add_photos_task( lad_id ):
There is next script in 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//')
When you run celery -A tasks worker --loglevel=info
, your celery app should be exposed in the module tasks
. It shouldn't be wrapped in a function or an if
statements that.
If you make_celery
in another file, you should import the celery app in to your the file you are passing to celery.
I forgot to create a celery object in 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 ):
...
After that we could normally start tasks:
celery -A tasks worker --loglevel=info