我目前正在建立一个小型django项目,我决定使用cookiecutter-django作为基地,因为我需要的东西都包括在内。在设置项目时,我要求cookiecutter-django包含Celery的设置,我可以找到项目中的所有内容,到目前为止一切顺利。但是我确实有一些问题让Celery按原样运行。当我从应用程序启动任务时没有任何事情发生。
docker容器全部正常启动。 Django和Postgres工作,Redis已经启动,我能够进入容器并查询它。从控制台输出我看到celeryworker容器已启动并运行。我也看到Celery正在认识我的任务:
celeryworker_1 | [tasks]
celeryworker_1 | . metagrabber.taskapp.celery.debug_task
celeryworker_1 | . scan_and_extract_meta
celeryworker_1 | . start_job
在经历了很多关于此事的困惑后,我决定为Flower创建一个新的Docker容器,以了解引擎盖下发生了什么。有趣的是,我可以看到有一个工人,它的名字是正确的(我比较了Celery容器中的工人ID)。但是,如果我从我的一个观点开始这样的任务:
celery_task_id = start_job_task.delay(job.id)
我没有看到Flower上的任何任务。我可以看到celery_task_id
获得了UUID,但这就是一切。在Flower上看不到任何内容(活动,已处理,失败,成功,重试的所有计数保持为0)。如果我在Redis容器中执行bash并使用redis-cli
,我就不会看到名为celery
的队列,这意味着没有Celery任务。可能(我说可能)是Flower在日志上留下的线索:
flower_1 | [W 180304 10:31:05 control:44] 'stats' inspect method failed
flower_1 | [W 180304 10:31:05 control:44] 'active_queues' inspect method failed
flower_1 | [W 180304 10:31:05 control:44] 'registered' inspect method failed
flower_1 | [W 180304 10:31:05 control:44] 'scheduled' inspect method failed
但说实话,我不知道这对我有什么帮助。
所以我继续添加了一些日志记录,看看发生了什么,我发现实际上我的Django容器在执行start_job_task.delay(job.id)
而不是交给Celery时尝试完成工作。我不知何故感觉这一切都与Redis有一些不好的联系。但是怎么样? docker-compose文件中的配置看起来就像cookiecutter设置的方式一样:
redis:
image: redis:3.0
celeryworker:
<<: *django
depends_on:
- redis
- postgres
environment:
- C_FORCE_ROOT=true # just for local testing
ports: []
command: /start-celeryworker.sh
我也尝试手动暴露Redis容器上的端口,但这并没有让我更进一步。
为了完整性,这是我的配置文件中的Celery设置。与cookiecutter一起设置:
# base.py
INSTALLED_APPS += ['mailspidy.taskapp.celery.CeleryConfig']
CELERY_BROKER_URL = env('CELERY_BROKER_URL', default='django://')
if CELERY_BROKER_URL == 'django://':
CELERY_RESULT_BACKEND = 'redis://'
else:
CELERY_RESULT_BACKEND = CELERY_BROKER_URL
# local.py
CELERY_ALWAYS_EAGER = True
为什么任务没有被发送到芹菜的任何想法?