How to start a Celery worker from a script/module __main__?
using app.worker_main method (v3.1.12):
± cat start_celery.py
#!/usr/bin/python
from myapp import app
if __name__ == "__main__":
argv = [
'worker',
'--loglevel=DEBUG',
]
app.worker_main(argv)
Since Celery 5 things have been changed
The worker_main
results now:
AttributeError: 'Celery' object has no attribute 'worker_main'
For Celery 5 do following:
app = celery.Celery(
'project',
include=['project.tasks']
)
if __name__ == '__main__':
worker = app.Worker(
include=['project.tasks']
)
worker.start()
See here celery.apps.worker and celery.worker.WorkController.setup_defaults for details (hope it will be documented better in the future).
Based on code from Django-Celery module you could try something like this:
from __future__ import absolute_import, unicode_literals
from celery import current_app
from celery.bin import worker
if __name__ == '__main__':
app = current_app._get_current_object()
worker = worker.worker(app=app)
options = {
'broker': 'amqp://guest:guest@localhost:5672//',
'loglevel': 'INFO',
'traceback': True,
}
worker.run(**options)
worker_main
was put back in celery 5.0.3 here:
https://github.com/celery/celery/pull/6481
This worked for me on 5.0.4:
self.app.worker_main(argv = ['worker', '--loglevel=info', '--concurrency={}'.format(os.environ['CELERY_CONCURRENCY']), '--without-gossip'])