Стоит задача сделать несколько запросов (6-7) на разные сервера.
Сейчас все запросы выполняются по очереди. Каждый запрос занимает от 5 до 30 секунд.
Можно ли сделать в DJANGO 2.2 так, чтобы запросы отправились одновременно (асинхронно), далее получаем результат и "обрабатываем" его.
Сейчас использую Celery, но не понимаю, как дождаться ответа от сервера.
Или выбрал неудачный фреймворк для этого? Тогда какие фреймворки подходят для асинхронных запросов (не обязательно python)
Опишите максимально подробно задачу. Особенно интересен момент "дождаться ответа от сервера". Дождаться где и чем? В таске Celery? В представлении Django?
Сергей Горностаев, в представлении django написан следующий код:
отправляем 1 запрос на сервер (это сторонние апи)
получаем результат (время выполнения запроса ~20 сек)
обрабатываем
отправляем 2 запрос на сервер (это сторонние апи)
получаем результат (время выполнения запроса ~20 сек)
обрабатываем
...
После выполнения всех 6 запросов записываем результат в бд
К примеру каждый запрос занял 20 сек*6 = 2 минуты на выполнение всех запросов.
Хотелось бы отправить все запросы одновременно и снизить это время до примерных 20 сек
javedimka, нет, не только запросы. Личный кабинет, пополнение баланса и тд. Фреймворк был выбран для изучения python, но просто так изучать было не интересно, поэтому написал небольшой проект.
max3277, в представлении просто запускайте таску Celery и завершайте работу представления, а таска пусть отправляет запрос, ждёт результата, запускает другую таску и т.д.
Сергей Горностаев, но если таска будет ждать результата, а после запускать другую и тд, то время выполнения все равно будет ~2 минуты
Или делать отдельную таску на каждый из 6 запросов.
отправляем 1 запрос на сервер (это сторонние апи)
получаем результат (время выполнения запроса ~20 сек)
обрабатываем
отправляем 2 запрос на сервер (это сторонние апи)
получаем результат (время выполнения запроса ~20 сек)
обрабатываем
...
После выполнения всех 6 запросов записываем результат в бд
Если запросы друг от друга независимы, то можно из одной таски запустить сразу 6 других и ждать их завершения. Тогда общее время выполнения корневой такси будет равно времени выполнения самой долгой из 6.
Сергей Горностаев, есть как и зависимые запросы, так и независимые.
К примеру первые два независимые.
3 - 6 зависят от первых двух
Т.е. как я понимаю, нужно первые два отправить асинхронно. "Обработать" их, отправить остальные 4 запроса тоже асинхронно.
Как мне дождаться в celery выполнения первых двух запросов?
max3277, принцип относительно прост: независящие друг от друга запросы запускайте одновременно в разных тасках, а они пусть запускают таски с запросами от которых зависят.
вкратце, при постановке задачи в Celery каждой задаче присваивается уникальный идентификатор и он возвращается после создания задачи сразу
далее есть два варианта:
1. задачи можно обьединить в цепочку и после запустить результирующую задачу
2. можно сформировать массив из идентификаторов задач и опрашивать Celery на их статус