Есть ли смысл от celery, если нужно получить результат выполнения метода?
Есть REST-метод на fastapi:
генерирует аудио, сохраняет аудио, возвращает аудио. Каждый запрос логируется.
Если аудио существует, то возвращает существующее.
Что хочется сделать:
1. Проверять, существует ли аудио: возвращать, если да.
2. Иначе генерировать аудио.
3. Возвращать.
4. В BackgroundTasks сохранять аудио запись и записывать лог.
Я правильно понимаю, что по скорости ответа я получу профит за счет того, что не буду ждать, когда запишется лог и сохранится запись?
Заметил, что раннее коллеги использовали селери: task = celery.task(); task.get(). Но никак не могу понять, стоит ли так делать?
В чем вообще смысл использовать celery, если нужно дождаться результата?
Что лучше: celery или отдельный сервис для логирования с rabbitmq?
Заметил, что раннее коллеги использовали селери: task = celery.task(); task.get().
Вероятно, коллеги - говнокодеры. Первое, чему учится программист асинхронщины - это не опираться на время и последовательности событий, код пишется с учётом недетерминированности конкурентной среды.
Сергей Горностаев, Я немного неправильно описал ситуацию в коде, утрировал. Возможно, чего-то не совсем понимаю, все-таки не код проекта приложил.
Концептуально я стремился разграничить зоны ответственности и после отправки сообщений в очередь: чтобы ничего уже не ждать,- например, заранее генерировал id.
Но возвращаясь к celery, зачем-то же в celery оставили функцию .get().
1. Может вы знаете варианты, зачем, когда ее стоит применять, чтобы не было чувства, что как-то концептуально асинхронщину нарушаю?
2. Я вообще правильно понял, что писать так task = celery.task(); task.get(), смысла вообще нет? Ни какого буста к скорости не будет?
Например, при реализации REST-методов и логирования запросов от клиента: нужно было добавить создание запроса, вернуть id и потом обновлять запрос в БД.
3. Но если перед получением результата выполнять еще какие-то действия, то в принципе так можно?
LakeForest,
1. Для тестов и фоновых процессов, которые могут себе позволить блокироваться в ожидании результатов.
2. Будет ещё медленнее, чем без celery.
3. Нельзя опираться на гарантию, что выполнение task займёт меньше времени, чем выполнение трёх функций processing. Если не займёт, то get заблокирует цикл событий, и весь сервис всттанет колом, зависнет обслуживание вообще всех клиентов.