如何在没有-A选项的情况下运行芹菜状态/花?

Ale*_*all 14 python redis celery docker flower

考虑一下这个bash会话:

$ export DJANGO_SETTINGS_MODULE=web.settings
$ celery status -b redis://redis.businessoptics.dev:6379/1 -t 10
Error: No nodes replied within time constraint.
$ celery status -b redis://redis.businessoptics.dev:6379/1 -t 10 -A scaffold.tasks.celery_app
celery@worker.9e2c39a1c42c: OK
Run Code Online (Sandbox Code Playgroud)

为什么我需要这个-A选项?据我所知,芹菜应该能够在redis上检测必要的元数据.

同样,如果我运行celery flower -b <redis url>它表明它成功连接到redis但没有显示任何真正的工人/任务/队列,并显示几个消息,如'stats' inspect method failed.再次,添加-A使其工作.

我想在一个不包含任何代码或其依赖项的最小独立Docker容器中运行flower.像这样的几个回购提供了这种东西.那我该怎么办呢?链接的repo提供了许多选项,但无法指定-A选项,这表明没有必要.

我是芹菜的初学者所以我可能会错过一些愚蠢的东西.我应该做些什么?

scaffold.tasks.celery_app模块看起来像这样:

from celery import Celery
from django.conf import settings

app = Celery()
app.config_from_object(settings)
Run Code Online (Sandbox Code Playgroud)

这些是涉及芹菜的Django设置:

{'BROKER_HEARTBEAT': 0,
 'BROKER_TRANSPORT_OPTIONS': {'fanout_patterns': True,
                              'fanout_prefix': True,
                              'visibility_timeout': 172800},
 'BROKER_URL': 'redis://redis.businessoptics.dev:6379/1',
 'CELERYBEAT_SCHEDULE': {'journey-heartbeat': {'args': (),
                                               'schedule': <crontab: * * * * * (m/h/d/dM/MY)>,
                                               'task': 'kms.data.journey.tasks.heartbeat'}},
 'CELERYD_CONCURRENCY': 1,
 'CELERYD_HIJACK_ROOT_LOGGER': False,
 'CELERYD_LOG_COLOR': False,
 'CELERYD_MAX_TASKS_PER_CHILD': 1,
 'CELERYD_PREFETCH_MULTIPLIER': 1,
 'CELERY_ACCEPT_CONTENT': ['pickle'],
 'CELERY_ACKS_LATE': True,
 'CELERY_DEFAULT_EXCHANGE': 'default',
 'CELERY_DEFAULT_EXCHANGE_TYPE': 'direct',
 'CELERY_DEFAULT_QUEUE': 'default',
 'CELERY_DEFAULT_ROUTING_KEY': 'default',
 'CELERY_IGNORE_RESULT': False,
 'CELERY_IMPORTS': ['kms.knowledge.query.tasks2',
                    # names of several more modules...
                   ],
 'CELERY_QUEUES': [<unbound Queue tablestore -> <unbound Exchange default(direct)> -> kms.data.table_store.tasks.#>,
                    # several more similar-looking Queues...
                   <unbound Queue default -> <unbound Exchange default(direct)> -> default>],
 'CELERY_REDIRECT_STDOUTS': False,
 'CELERY_RESULT_BACKEND': 'database',
 'CELERY_RESULT_DBURI': 'mysql://businessoptics:businessoptics@mysql.businessoptics.dev:3306/product',
 'CELERY_RESULT_DB_SHORT_LIVED_SESSIONS': True,
 'CELERY_ROUTES': ['scaffold.tasks.routers.TaskNameRouter'],
 'CELERY_SEND_EVENTS': True,
 'CELERY_SEND_TASK_ERROR_EMAILS': False,
 'CELERY_SEND_TASK_SENT_EVENT': True,
 'CELERY_STORE_ERRORS_EVEN_IF_IGNORED': True,
 'CELERY_TASKNAME_ROUTES': [('tablestore', 'kms.data.table_store.tasks.#'),
                            # bunch of routes...
                            ],
 'CELERY_TASK_RESULT_EXPIRES': None,
 'CELERY_TIMEZONE': 'UTC',
 'CELERY_TRACK_STARTED': True,
 'CELERY_WORKER_DIRECT': True
}
Run Code Online (Sandbox Code Playgroud)

以下是相关版本:

celery==3.1.19
Django==1.8
django-celery==3.1.0
redis==2.10.3
Run Code Online (Sandbox Code Playgroud)

Mau*_*cco 6

-A选项是使用相关配置传递celery实例的选项,包括包含任务的包.

要使用所有功能,需要像工作人员一样配置花朵,这意味着了解芹菜任务所在的包装并了解它们.

添加到您的docker容器中所需的python库不应该那么难,例如,您可以通过以下方式将配置行CELERY_IMPORTS 添加到此文件中:

CELERY_IMPORTS  = os.getenv('CELERY_IMPORTS  ', 'default.package') 
Run Code Online (Sandbox Code Playgroud)

UPDATE

正如@asksol,芹菜创造者,在评论中指出这里是一个更详细的解释,为什么你需要-A选项:

Flower也是一个消息消费者,因此将有助于恢复未经处理的消息.由于您定义了自定义可见性,因此启动未配置的花意味着它将使用默认的可见性超时,因此将比您的工作人员更快地重新发送未打包的消息.始终使用-A,以便工作人员,花卉和客户端配置保持同步

  • ahmed使用`--broker`参数指定代理,这通常就足够了,但你设置的`fanout_patterns`选项不能在命令行中设置.-A选项告诉celery配置的位置,最佳做法是始终指定app flower应该使用的位置. (2认同)
  • Flower也是一个消息消费者,因此将有助于恢复未经处理的消息.由于您定义了自定义可见性,因此启动未配置的花意味着它将使用默认的可见性超时,因此将比您的工作人员更快地重新发送未打包的消息.始终使用-A,以便工作人员,花卉和客户端配置保持同步. (2认同)
  • 我希望我可以多次投票.在此之前,我并没有真正理解`-A`选项的用途.记录它是有用的([docs](http://flower.readthedocs.io/en/latest/)在示例中使用它,但实际上没有解释它). (2认同)