Проблемы с запуском Celery-задач в асинхронной функции
В проекте, в качестве endpoint'ов используются асинхронные функции.
Есть необходимость запускать Celery-задачу внутри endpoint'а.
Функция (celery task):
@celery_app.task
def some_celery_func(arg1):
...
Запускаю её внутри асинхронной функции (endpoint'а) следующей командой:
some_celery_func.delay(11)
В терминале запущен воркер: celery -A <myproj> worker -E -l INFO
Версия Celery: 4.4.0
Версия Python: 3.7
Проблема:
Celery задача запускается, в буквальном смысле, через раз.
Вопрос:
В чём может быть проблема и как её возможно разрешить?
Ответы (1 шт):
Установил причину такого поведения. Дело в том, что worker'ы подвисли и "превратились в демонов" оторвавшись от родительского процесса.
Как выяснил:
- Отключил worker в терминале.
- Открыл админ-панель rabbitmq.
- Открыл "Очередь" -> выбрал главную очередь.
Инициировал запуск Celery-задачи.
В графике увидел, что не смотря на то, что мой worker выключен rabbitmq принял запрос и обработал его. В терминале, с помощью htop, просмотрел текущие процессы и треды. Принудительно завершил подвешанные worker'ы.
Далее:
- Запустил worker в терминале.
- Повторно инициировал несколько запусков Celery-задачи.
- В графике и в терминале увидел, что все задачи успешной отработаны.
В принципе типичная проблема, но до последнего был уверен, что дело в используемом асинхронном коде приложения.