Как начать работу с сельдереем из script/module __main__?

Я определил приложение Celery в модуле, и теперь я хочу запустить работника из того же модуля в его __main__, то есть, запустив модуль с python -m вместо Celery из командная строка. Я пробовал это:

app = Celery('project', include=['project.tasks'])

# do all kind of project-specific configuration
# that should occur whenever this module is imported

if __name__ == '__main__':
    # log stuff about the configuration
    app.start(['worker', '-A', 'project.tasks'])

но теперь Сельелли считает, что я бегу рабочего без аргументов:

Usage: worker <command> [options] 

Show help screen and exit.

Options:
  -A APP, --app=APP     app instance to use (e.g. module.attr_name)
[snip]

Сообщение об использовании - это тот, который вы получаете от celery --help, как будто он не получил команду. Я также пробовал

app.worker_main(['-A', 'project.tasks'])

но он жалуется, что -A не распознается.

Итак, как мне это сделать? Или, альтернативно, как мне передать обратный вызов работнику, чтобы он записывал информацию о его конфигурации?

Ответы

Ответ 1

На основе кода из модуля Django-Celery вы можете попробовать что-то вроде этого:

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:[email protected]:5672//',
        'loglevel': 'INFO',
        'traceback': True,
    }

    worker.run(**options)

Ответ 2

с помощью метода app.worker_main (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)

Ответ 3

Я думаю, что вам просто не хватает обертывания аргов, поэтому сельдерей может их прочесть, например:

queue = Celery('blah', include=['blah'])
queue.start(argv=['celery', 'worker', '-l', 'info'])