Процесс Django выполняет задачи вместо Celery
Я запускаю приложение с Celery+redis для асинхронных задач. Мне удалось заставить Celery видеть список задач. Однако мои задачи выполняются не рабочими Celery, а процессом Django.
Я пробовал вызывать задачи с помощью .delay()
и .apply_async()
без успеха (фактически в этих случаях вызов задачи блокируется на неопределенное время и в логах ничего не отображается).
Возможно, я упускаю что-то очень важное, но не могу понять где.
Далее следуют соответствующие настройки:
settings.py
CELERY_REDIS_DB = os.environ.get("REDIS_DB_CELERY", 0)
CELERY_REDIS_HOST = os.getenv("REDIS_HOSTNAME", "redis")
CELERY_REDIS_PORT = 6379
CELERY_RESULT_BACKEND = BROKER_URL = (
f'redis://{CELERY_REDIS_HOST}:{CELERY_REDIS_PORT}/{CELERY_REDIS_DB}'
)
CELERY_TIMEZONE = TIME_ZONE
CELERY_RESULT_EXPIRES = 5 * 60 * 60
celery.py
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'maat.settings')
app = Celery('maat')
# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
tasks.py
@shared_task
def remove_task(
environment=None,
payload=None,
**kwargs,
):
LOGGER.info('Received task, now removing')
...
views.py
class MyClass(
LoginRequiredMixin,
PermissionRequiredMixin,
SingleObjectMixin,
APIView
):
return_403 = True
model = models.Environment
slug_field = 'name'
slug_url_kwarg = 'environment'
def delete(self, request, environment):
tasks.remove_task(environment=environment, payload=request.data)
- Django 3.2
- celery[redis] 5.1.2
- redis 3.5.3
- django-celery-results 2.0.1
Предполагая, что celery.py
живет где-то, что доступно для views.py
, проблема, скорее всего, в том, что поскольку вы используете общую задачу, django не знает, как общаться с брокером celery без дополнительной информации.
Для этого мы можем последовать совету наших полезных друзей из stack overflow и сделать что-то вроде следующего в вашем представлении:
from path.to.celery import app
app.set_default()