У меня есть задание:
Получение запросов от 2 конечных точек API / api / 1 , / api / 2 , из которых я получаю список идентификаторов
Для каждого из перечисленных id из пункта 1. получите запросы / api / x / $ {id} / data
Затем я использую эти данные для заполнения элементов на веб-странице. Веб-страница построена с Python колбу и UWSGI.
Количество URL-адресов, на которые я отправляю запросы, теперь составляет 30, а в будущем будет максимум 60.
Мое текущее решение с asyncio и aiohttp, но я думаю, что я использую его неправильно.
Вот мой упрощенный код:
class MyClass:
async def fetch_page(self, session, url):
async with session.get(url) as response:
return await response.text()
async def pull_data(self):
first_endpoint = requests.get('https://domain/api/1')
first_endpoint = json.loads(first_endpoint.text)
second_endpoint = requests.get('https://domain/api/2')
second_endpoint = json.loads(second_endpoint.text)
endpoints = {**first_endpoint, **second_endpoint}
urls = []
for data in endpoints:
urls.append("https://domain/api/x/" + str(data['id']) + "/data")
async with aiohttp.ClientSession() as session:
html = await asyncio.wait([self.fetch_page(session, url) for url in urls])
for x in html:
# here I get the result data and send it
И вот как я это называю:
loop = asyncio.get_event_loop()
@app.route('/')
def index():
global loop
my_obj = MyClass()
loop.run_until_complete(my_obj.pull_data())
Первый пункт. Я думаю, что в дальнейшем будет больше конечных точек в пункте 1. Мне тоже нужно распараллелить эту часть кода, но как? я должен создать новый сеанс с aiohttp или как-то присоединить его к существующему?
и моя страница загружается в 2 с, что все еще медленно, какое время загрузки достижимо в этом сценарии? (без получения данных страница всегда загружается менее <0,5 с) </p>
Итак, мой вопрос: какую библиотеку / подход я должен выбрать для этой проблемы и как правильно использовать ее для ускорения загрузки моей страницы? Я буду счастлив с 1с нагрузкой
Другой подход, о котором я думал, - запустить новый процесс с помощью этого приложения-колбы, которое будет получать данные и кэшировать их где-то, но, боюсь, тогда я не получаю «свежие» / фактические данные всегда на каждой странице перезагрузить