web-dev-qa-db-fra.com

Comment démarrer un céleri depuis un script / module __main__?

J'ai défini une application Celery dans un module, et maintenant je veux démarrer le travailleur à partir du même module dans son __main__, c'est-à-dire en exécutant le module avec python -m au lieu de celery à partir de la ligne de commande. J'ai essayé ceci:

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'])

mais maintenant Celery pense que je dirige le travailleur sans arguments:

Usage: worker <command> [options] 

Show help screen and exit.

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

Le message d'utilisation est celui que vous obtenez de celery --help, comme s'il n'avait pas reçu de commande. J'ai aussi essayé

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

mais cela se plaint du -A non reconnu.

Alors, comment dois-je procéder? Ou bien, comment puis-je transmettre un rappel au travailleur pour qu'il enregistre des informations sur sa configuration?

19
Fred Foo

Basé sur code du module Django-Celery vous pouvez essayer quelque chose comme ceci:

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)
10
daniula

en utilisant la méthode 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)
17
okocian

Je pense que vous manquez juste d'enrouler les arguments pour que le céleri puisse les lire, comme:

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