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

考虑这个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选项? 据我所知,芹菜应该能够检测到redis上必要的元数据。

同样,如果我运行celery flower -b <redis url>它会显示它已成功连接到redis,但不显示任何真正的工人/任务/队列,并显示'stats' inspect method failed等几条消息。 再次,join-A导致它工作。

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

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

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

 from celery import Celery from django.conf import settings app = Celery() app.config_from_object(settings) 

这些是涉及芹菜的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 

-A选项是将芹菜实例与相关configuration(包括包含任务的包)一起传递的选项。

要使用所有的function,需要像工人一样configuration花卉,这意味着要知道芹菜任务所在的包装并知道它们。

添加到你的docker容器所需的Python库应该不是那么难,例如你可以添加到这个文件的configuration行CELERY_IMPORTS在以下方式:

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

UPDATE

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

花也是消费者的消息,因此将有助于恢复未消息的消息。 由于您定义了自定义的可见性,因此启动花卉未configuration意味着它将使用默认的可见性超时,因此将比工作人员更快地重新传递未被分类的消息。 始终使用-A,以便工人,花卉和客户端configuration同步