Как сделать быстрое выполнение запросов get в приложении python flask - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть задание:

  1. Получение запросов от 2 конечных точек API / api / 1 , / api / 2 , из которых я получаю список идентификаторов

  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с нагрузкой

Другой подход, о котором я думал, - запустить новый процесс с помощью этого приложения-колбы, которое будет получать данные и кэшировать их где-то, но, боюсь, тогда я не получаю «свежие» / фактические данные всегда на каждой странице перезагрузить

...