3

現在、小さな 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 を比較しました)。ただし、次のようなビューの 1 つからタスクを開始すると:

celery_task_id = start_job_task.delay(job.id)

Flower にタスクが入ってくる様子がありません。celery_task_idUUIDを取得することがわかりますが、それですべてです。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

タスクが Celery に送信されない理由はありますか?

4

0 に答える 0