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. В частности,
В своем
.settings.py,
вы смешиваете старый и новый стили конфигурирования Celery. Для Celery 4 и последующих версий предпочтительны настройки конфигурации со строчными буквами: https://docs.celeryq.dev/en/stable/userguide/configuration.html#new-lowercase-settingsВы настроили URL брокера дважды (
amqp://guest@localhost:15672/
иamqp://localhost
), и вы настроили два разных бэкенда результатов.Вы передали конфигурацию экземпляру 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/')