将Celery与cookiecutter-django项目一起使用

时间:2018-03-04 10:07:25

标签: django docker-compose celery cookiecutter-django

我目前正在建立一个小型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

为什么任务没有被发送到芹菜的任何想法?

0 个答案:

没有答案