私も今同じことで悩んでいます。これは私がそれを見る方法です:
タスクを実行する通信アプリケーションと、タスクを実行するワーカーの 2 つのエンドがあります。
作業員はアプリを知らなくていい!ワーカー部分については、celeryconfig を知っていれば十分です。セロリ ワーカー --config=mypackage.celeryconfig で渡すことができます。ワーカーは BROKER_URL でキューに接続します。そこでCELERY_IMPORTSを宣言することを忘れないでください。これにより、ワーカーはタスク定義を探す場所を知ることができます。
クライアント アプリは、その要求の送信先を認識している必要があります。したがって、構成ファイルを渡す方法の 1 つを使用して、同じ構成を渡す必要があります。私はこれを選びました:
from __future__ import absolute_import
from celery import Celery
celery = Celery()
import backend.async.celeryconfig
celery.config_from_object(backend.async.celeryconfig)
このセットアップは、デーモンなしで実行すると機能しますが、何らかの理由でデーモンが私の CELERY_CONFIG_MODULE 設定を無視します。
アップデート:
CELERY_CONFIG_MODULE は /etc/init.d/celeryd スクリプトのどこにも使用されていません!
代わりに、私はそれを CELERYD_OPTS に入れました。
CELERYD_OPTS="--config=backend.async.celeryconfig"
もう1つは、VIRTUAL_ENV変数がcelerydスクリプトでも無視されることです。もう一方の celerybeat scirpt では、仮想環境がアクティブになるため、推奨される構成は次のとおりです。
CELERYBEAT_OPTS="--schedule=/var/run/celerybeat-schedule --config=backend.async.celeryconfig"
VIRTUAL_ENV="/path/to/.virtualenvs/your_env"
# Python interpreter from environment.
ENV_PYTHON="$VIRTUAL_ENV/bin/python"
# How to call "celeryd-multi"
CELERYD_MULTI="$VIRTUAL_ENV/bin/celeryd-multi"
#CELERYD="$VIRTUAL_ENV/celeryd"
# How to call "celeryctl"
CELERYCTL="$VIRTUAL_ENV/bin/celeryctl"
# How to call "celerybeat"
CELERYBEAT="$VIRTUAL_ENV/bin/celerybeat"