Зачем нужен celery?
Например, очередь заданий по конвертации видео для веб-приложения на Django.Попытка выполнять такую задачу в Django непосредственно при обработке запросов по-умолчанию будет приводить к 504 Gateway Timeout (слишком долгий запрос) со стороны Nginx или иного HTTP-сервера.Попытка делать это с помощью Cron и произвольных команд Django -- немного неудобна. Допустим, Cron выполняет произвольную команду Django раз в 1 минуту:python3 path/manage.py convert_next_video
, при этом первый видео файл будет конвертироваться 5 минут, после этого будет помечен в базе данных как is_converted (конвертирован) и команда на этом завершится. Через минуту cron снова запустит команду для конвертации следующего файла.
Но за 5 минут файл ещё не будет помечен как конвертированный, поэтому cron за 5 минут создаст 4-5 процессов, которые будут конвертировать один и тот же файл.
Ладно, тогда при начале конвертирования файл сразу будем помечать как конвертируемый, чтобы другие процессы брали другие файлы.
Но что будет если процесс упадёт? Отмечать время начала конвертирования в базе данных и если прошло больше n часов, конвертировать повторно -- так себе решение.
И что если пользователи загрузят 10 файлов каждый из которых будет конвертироваться 30 минут? Через 10-11 минут на сервере будут работать 10 процессов конвертирующих видео. Большая нагрузка на сервер. Можно завести в базе данных таблицу в которой отмечается сколько файлов конвертируется в данный момент.
Решив использовать cron для долгих по выполнении задач, нам придётся решать целый ряд проблем.
Стоит использовать фреймворки из-за того, что они создают унифицированную среду, которую смогут понять все, кто прочитал документацию. К своему решению вы не напишите документации. Фреймворки дают базовый и скучный код, который никто не любит писать.