I have a Django 1.11 and Celery 4.1 project, and I've configured it according to the setup docs. My celery_init.py
looks like
from __future__ import absolute_importimport osfrom celery import Celery# set the default Django settings module for the 'celery' program.
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings.settings'app = Celery('myproject')app.config_from_object('django.conf:settings', namespace='CELERY')#app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) # does nothing
app.autodiscover_tasks() # also does nothingprint('Registering debug task...')
@app.task(bind=True)
def debug_task(self):print('Request: {0!r}'.format(self.request))
However, when I launch a worker with:
.env/bin/celery worker -A myproject -l info
it shows no tasks being found except for the sample "debug_task", even though I have several installed apps with Celery tasks, with should have been found via the call to app.autodiscover_task()
. This is the initial output my worker generates:
-------------- celery@localhost v4.1.0 (latentcall)
---- **** -----
--- * *** * -- Linux-4.13.0-16-generic-x86_64-with-Ubuntu-16.04-xenial 2017-10-31 15:56:42
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: myproject:0x7f952856d650
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results: amqp://
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- -------------- [queues].> celery exchange=celery(direct) key=celery[tasks]. myproject.celery_init.debug_task[2017-10-31 15:56:42,180: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[2017-10-31 15:56:42,188: INFO/MainProcess] mingle: searching for neighbors
[2017-10-31 15:56:43,211: INFO/MainProcess] mingle: all alone
[2017-10-31 15:56:43,237: INFO/MainProcess] celery@localhost ready.
All my legacy tasks in my app tasks.py
files were defined like:
from celery.task import task@task(name='mytask')
def mytask():blah
The docs suggest using the shared_task
decorator, so instead I tried:
from celery import shared_task@shared_task
def mytask():blah
But my Celery worker still doesn't see it. What am I doing wrong?
Edit: I've been able to get tasks to show up by explicitly listing them in my setting's CELERY_IMPORTS
list, but even then I have to heavily edit the tasks.py
to remove all imports of my Django project (models.py, etc) or it raises the exception Apps aren't loaded yet.
This is better than nothing, but requires a huge amount of refactoring. Is there a better way?