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?

questionAnswers(1)

yourAnswerToTheQuestion