【问题标题】:How do I run celery status/flower without the -A option?如何在没有 -A 选项的情况下运行 celery status/flower?
【发布时间】:2016-05-13 15:36:07
【问题描述】:

考虑一下这个 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

为什么我需要-A 选项?据我所知,celery 应该能够在 redis 上检测到必要的元数据。

类似地,如果我运行celery flower -b <redis url>,它显示它成功连接到redis,但没有显示任何真正的workers/tasks/queues,并显示几条消息,如'stats' inspect method failed。同样,添加 -A 会使其正常工作。

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

我是芹菜的初学者,所以我可能会错过一些愚蠢的东西。我该怎么办?

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

from celery import Celery
from django.conf import settings

app = Celery()
app.config_from_object(settings)

这些是涉及 celery 的 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
}

以下是相关版本:

celery==3.1.19
Django==1.8
django-celery==3.1.0
redis==2.10.3

【问题讨论】:

  • 对我来说flower --port=5555 --broker='redis://...'工作不通过-A

标签: python docker redis celery flower


【解决方案1】:

-A 选项是传递具有相关配置的 celery 实例的选项,包括包含您的任务的包。

要使用花的所有功能,需要像工人一样进行配置,这意味着知道你的 celery 任务所在的包并知道它们。

将所需的 python 库添加到您的 docker 容器中并不难,例如您可以通过以下方式将配置行 CELERY_IMPORTS 添加到this file

CELERY_IMPORTS  = os.getenv('CELERY_IMPORTS  ', 'default.package') 

更新

正如 celery 创建者 @asksol 在 cmets 中指出的,这里有一个更详细的解释,说明了为什么需要 -A 选项:

Flower 也是消息消费者,因此有助于恢复未确认的消息。由于您定义了自定义可见性,因此未配置启动花意味着它将使用默认可见性超时,因此将比您的工作人员更快地重新传递未确认的消息。始终使用 -A 以使 worker、flower 和 client 配置同步

【讨论】:

  • 你能解释一下为什么评论我的问题的艾哈迈德不需要通过选项吗?
  • 你应该问他而不是我。
  • ahmed 使用 --broker 参数指定代理,这通常就足够了,但是您设置了无法在命令行上设置的 fanout_patterns 选项集。 -A 选项告诉 celery 配置在哪里,最佳实践是始终指定应用程序花应该使用。
  • Flower 也是消息消费者,因此有助于恢复未确认的消息。由于您定义了自定义可见性,因此未配置启动花意味着它将使用默认可见性超时,因此将比您的工作人员更快地重新传递未确认的消息。始终使用 -A 以使 worker、flower 和 client 配置同步。
  • 我希望我能多次投票。在此之前,我并没有真正理解 -A 选项的目的。记录它会很有用(docs 在示例中使用它,但实际上并没有解释它)。
猜你喜欢
  • 2017-01-24
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2015-05-01
相关资源
最近更新 更多