aiohttp: taxa que limita solicitações paralelas
As APIs geralmente têm limites de taxa que os usuários precisam seguir. Como exemplo, vamos atender 50 solicitações / segundo. Os pedidos sequenciais levam de 0,5 a 1 segundo e, portanto, são muito lentos para chegar perto desse limite. Solicitações paralelas com aiohttp, no entanto, excedem o limite de taxa.
Para pesquisar a API o mais rápido possível, é necessário classificar o limite de chamadas paralelas.
Exemplos que encontrei até agora decoramsession.get
, aproximadamente assim:
session.get = rate_limited(max_calls_per_second)(session.get)
Isso funciona bem para chamadas seqüenciais. Tentar implementar isso em chamadas paralelas não funciona como planejado.
Aqui está um código como exemplo:
async with aiohttp.ClientSession() as session:
session.get = rate_limited(max_calls_per_second)(session.get)
tasks = (asyncio.ensure_future(download_coroutine(
timeout, session, url)) for url in urls)
process_responses_function(await asyncio.gather(*tasks))
O problema disso é que ele limitará a taxa defilas das tarefas. A execução comgather
ainda vai acontecer mais ou menos ao mesmo tempo. Pior dos dois mundos ;-).
Sim, encontrei uma pergunta semelhante aquiaiohttp: define o número máximo de solicitações por segundo, mas nenhuma das respostas responde à questão real de limitar a taxa de solicitações. Além dissoa postagem do blog de Quentin Pradet funciona apenas em limitar a taxa de enfileiramento.
Para finalizar: como limitar onúmero de solicitações por segundo para paraleloaiohttp
solicitações de?