web-dev-qa-db-ja.com

スクリプト/モジュール__main__からCeleryワーカーを起動する方法は?

モジュールにCeleryアプリを定義しました。次に、__main__内の同じモジュールからワーカーを開始します。つまり、コマンドラインからceleryではなくpython -mを使用してモジュールを実行します。私はこれを試しました:

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が認識されないという不満を持っています。

では、どうすればよいですか?または、構成に関する情報をログに記録するようにワーカーにコールバックを渡すにはどうすればよいですか?

19
Fred Foo

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:guest@localhost:5672//',
        'loglevel': 'INFO',
        'traceback': True,
    }

    worker.run(**options)
10
daniula

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

セロリがそれらを読むことができるように、あなたは引数のラップを欠いているだけだと思います:

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