I\'ve define a Celery
app in a module, and now I want to start the worker from the same module in its __main__
, i.e. by running the module with
I think you are just missing wrapping the args so celery can read them, like:
queue = Celery('blah', include=['blah'])
queue.start(argv=['celery', 'worker', '-l', 'info'])
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'])
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)
The worker_main
results now:
AttributeError: 'Celery' object has no attribute 'worker_main'
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)