Django Cellery застрял в статусе Pending

Я пытаюсь использовать celery в моем приложении django для ускорения времени обработки функции и не могу заставить его работать правильно. Я использую RabbitMQ.

my tasks.py

from celery import Celery
from celery import shared_task,current_task
from myapp.celery import app

@app.task
def add(x,y):
    
    for i in range(25000000):
        a = x+y
    
    return x+y

мой код python

def test_multi_func():
    x = 5
    y = 10
    i = 15
    print(f"start = {time.perf_counter()}")
    while i > 0:
        g = add.delay(x,y)
        result = add.AsyncResult(g)
        i -= 1
    print(result.backend)
    print(result.status)
    print(f"end = {time.perf_counter()}")
    print(f"g = {g.get()}")
    print(f"x = {x} ; y = {y}")

my settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_select2',
    'chartjs',
    'django_material_icons',
    'material',
    'django_celery_results',
    'celery_progress',
    'django_apscheduler'
]

BROKER_URL = 'django://'
result_backend = 'django-db'
CELERY_RESULT_BACKEND = 'django-db'
result_persistent = True
task_result_expires = None
send_events = True
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_BROKER_URL = 'amqp://localhost'
CELERY_CACHE_BACKEND = 'django-cache'
CELERY_IGNORE_RESULT = False

my celery.py

import os

from celery import Celery

# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')

app = Celery('myapp',
             backend='amqp://guest@localhost:15672/',
             broker='amqp://guest@localhost:15672/',
             include=['myapp.tasks'])

app.config_from_object('django.conf:settings', namespace='CELERY')


app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

Что я делаю неправильно? Мне трудно понять это. Он запускает test_multi_func(), а затем застревает как ожидающий в RabbitMQ и ничего не происходит. Буду очень признателен, если кто-нибудь поможет мне понять, что мне нужно сделать по-другому. Я пробовал много различных итераций различных кодов, которые я мог найти в Интернете, но ничего не работает.

В вашей конфигурации celery много конфликтов, и мне интересно, как вы запускаете worker. В частности,

  1. В своем settings.py, вы смешиваете старый и новый стили конфигурирования Celery. Для Celery 4 и последующих версий предпочтительны настройки конфигурации со строчными буквами: https://docs.celeryq.dev/en/stable/userguide/configuration.html#new-lowercase-settings

    .
  2. Вы настроили URL брокера дважды (amqp://guest@localhost:15672/ и amqp://localhost), и вы настроили два разных бэкенда результатов.

  3. Вы передали конфигурацию экземпляру Celery три раза, и настройки накладываются друг на друга. В частности, когда мы передаем ваши настройки непосредственно в класс Celery, должен выглядеть следующим образом:

app = Celery('myapp',
             backend_url='amqp://guest@localhost:15672/',
             broker_backend='amqp://guest@localhost:15672/',
             include=['myapp.tasks'])

При желании вы можете создать экземпляр Celery и настроить его в два этапа:

app = Celery('myapp')
app.conf.update(broker_url='amqp://guest@localhost:15672/',
                result_backend='amqp://guest@localhost:15672/')
Вернуться на верх