Почему задачи, зарегистрированные через Celery, не выполняются?

Как исправить проблему, когда задачи через Celery не выполняются и остаются в статусе "Получено"? Здесь приведены код и информация о среде для справки:

tasks.py:
```
from celery import Celery, shared_task

app=Celery('tasks', broker='amqp://user:[email protected]:5672/vhost', backend='redis://localhost:6379/0')

@shared_task
def add(x, y):
    return x + y
```

start_task.py:
```
import tasks

r = tasks.add.delay(3, 3)
a = r.get()
print(a)
```

У меня установлен RabbitMQ на сервере Ubuntu, Celery подключается к нему успешно. Я также успешно подключался к RabbitMQ через библиотеку pika, отправляя и получая сообщения без проблем. Однако, если я запускаю задачи через Celery, они не выполняются и остаются в статусе "Получено". Я впервые устанавливаю Celery и RabbitMQ, возможно, я допустил какую-то глупую ошибку. Ниже представлен скриншот из Flower.

Вопрос:
Как решить проблему с невыполнением задач через Celery и их застреванием в статусе "Получено"?
Изображение к вопросу
  • 19 октября 2023 г. 20:18
Ответы на вопрос 5
Если задачи, зарегистрированные через Celery, не выполняются и застревают в статусе "Получено", возможно, у вас есть проблемы с конфигурацией или настройками Celery и RabbitMQ. Вот несколько возможных шагов для их исправления:

1. Убедитесь, что у вас установлен и работает RabbitMQ. Вы можете проверить статус его службы с помощью команды `sudo service rabbitmq-server status`. Если служба не запущена, вы можете запустить ее с помощью команды `sudo service rabbitmq-server start`.

2. Убедитесь, что у вас установлены все необходимые зависимости для Celery. Вы можете установить их, выполнив команду `pip install -r requirements.txt`, где `requirements.txt` содержит зависимости, включая Celery и Redis.

3. Проверьте, что вы правильно настроили брокера сообщений и бэкенд в коде задачи. В вашем случае вы используете RabbitMQ в качестве брокера и Redis в качестве бэкенда. Убедитесь, что у вас есть правильные адреса, порты, учетные данные и виртуальный хост для подключения к ним.

4. Убедитесь, что у вас есть достаточно рабочих потоков для обработки задач. Проверьте настройки конфигурации Celery в файле `celeryconfig.py` или экземпляре `Celery`. Установите опцию `CELERYD_CONCURRENCY` в значение больше 0, чтобы задачи могли быть обработаны.

5. Проверьте логи, чтобы увидеть, есть ли какие-либо сообщения об ошибках или проблемах. Обычно логи Celery находятся в директории `/var/log/celery/`, если вы используете системные службы для запуска Celery.

6. Если все остальное не сработало, попробуйте перезапустить RabbitMQ и Celery, чтобы убедиться, что все изменения настроек вступили в силу.

Надеюсь, эти шаги помогут вам устранить проблему с невыполнением задач через Celery. Если проблема не решена, рекомендуется обратиться к документации Celery и RabbitMQ или искать поддержку в сообществе.
логи воркера можно просмотреть здесь: [ссылка на статью с инструкцией](https://habr.com/ru/articles/686820/)
код достаточно простой, но использование Celery может вызвать некоторые сложности.
если у вас нет желания перейти на dramatiq, попробуйте настроить Celery, следуя инструкции, а затем делайте необходимые изменения.
также рекомендуется заменить используемый брокер на Редис, поскольку RabbitMQ в данном случае излишен.
Похожие вопросы