Я пытаюсь делать вызовы API с Python асинхронно.У меня есть несколько конечных точек в списке, и каждая конечная точка будет возвращать постраничные результаты.Я могу настроить асинхронное выполнение нескольких конечных точек, однако не могу вернуть разбитые на страницы результаты каждой конечной точки.
Из отладки я обнаружил, что функция fetch_more()
запускает цикл while, но фактически не проходит асинхронно с помощью session.get ().Так в основном.Функция fetch_more()
предназначена для получения оставшихся результатов от вызова API для каждой конечной точки, однако я считаю, что одинаковое количество результатов возвращается с или без функции fetch_more()
.Я пытался найти примеры нумерации страниц с помощью asyncio, но мне не повезло.
Насколько я понимаю, я не должен делать запрос внутри цикла while, однако я не уверен, что можно обойти это, чтобы получить постраничные результаты.
if __name__ == 'main':
starter_fun(url, header, endpoints):
starter_func(url, header, endpoints):
loop = asyncio.get_event_loop() #event loop
future = asyncio.ensure_future(fetch_all(url, header, endpoints))
loop.run_until_complete(future) #loop until done
async def fetch_all(url, header, endpoints):
async with ClientSession() as session:
for endpoint in endpoints:
task = asyncio.ensure_future(fetch(url, header, endpoint))
tasks.append(task)
res = await asyncio.gather(*tasks) # gather task responses
return res
async def fetch(url, header, endpoint):
total_tasks = []
async with session.get(url, headers=header, params=params, ssl=False) as response:
response_json = await response.json()
data = response_json['key']
tasks = asyncio.ensure_future(fetch_more(response_json, data, params, header, url, endpoint, session)) //this is where I am getting stuck
total_tasks.append(tasks)
return data
//function to get paginated results of api endpoint
async def fetch_more(response_json, data, params, header, url, endpoint, session): //this is where I am getting stuck
while len(response_json['key']) >= params['limit']:
params['offset'] = response_json['offset'] + len(response_json['key'])
async with session.get(url, headers=header, params=params, ssl=False) as response_continued:
resp_continued_json = await response_continued.json()
data.extend(resp_continued_json[kebab_to_camel(endpoint)])
return data
В настоящее время я получаю 1000 результатов с или без функции fetch_more
, однако с fetch_more
должно быть намного больше.Любая идея о том, как подходить к асинхронной нумерации страниц?