Параллельные вызовы не выполняются с ожидаемой скоростью на сервере разработки flask - PullRequest
0 голосов
/ 08 апреля 2020

Моя проблема в том, что когда я звоню await asyncio.gather(*tasks), параллельные вызовы не достигают ожидаемой скорости. Есть только 30 параллельных запросов, но для запуска 20-го запроса потребуется около 10 секунд, где максимальное время ответа будет 4 секунды. Здесь я попадаю во внутреннюю конечную точку flask, которая затем вызывает внешнюю конечную точку API. Кажется, он идет параллельно, но не сразу.

Ожидаемый результат - когда я запускаю 30 запросов, это не должно занимать даже 1 секунды. Огонь все сразу.

Это внутренняя конечная точка в flask, которая будет вызывать наш внутренний метод, а этот метод будет вызывать внешний API для получения результатов. Этот метод ниже в файле маршрута. Я использую python 3.5.2 и aiohttp 2.3.10.

@car_search.route("car-detail/car-test", methods=['GET', 'POST'])
def async_zeep_call_1():
    return async_zeep_call()

async def make_parallel_request(session, url, data):
    async with session.post(url = url, data = data) as response:
        return await response.text()

async def parallel_calls(list_of_cars):
    tasks = []
    async with aiohttp.ClientSession() as session:
        for each_req in list_of_cars:
            tasks.append(make_parallel_request(session, each_req['url'], 
                                               each_req['data']))
        result_data = await asyncio.gather(*tasks)
    return result_data

#Default url is internal url "car-detail/car-test"
def new_method():
    url = "car-detail/car-test"
    list_of_cars = []
    data = {
                    "external_endpoint": endpoint,
                    "uname": uname,
                    "password": password
                }
    for item in range(30):
        single_req = {'url': url, 'data': json.dumps(data), 'headers': {}}
        list_of_cars.append(single_req)
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    response_list = loop.run_until_complete(parallel_calls(list_of_cars))
...