Eu tenho muitos problemas com a maioria das respostas postadas - eles usam bibliotecas obsoletas que foram portadas com recursos limitados ou fornecem uma solução com muita mágica na execução da solicitação, dificultando a manipulação de erros. Se eles não se enquadram em uma das categorias acima, são bibliotecas de terceiros ou estão obsoletas.
Algumas das soluções funcionam bem puramente em solicitações http, mas as soluções ficam aquém de qualquer outro tipo de solicitação, o que é ridículo. Uma solução altamente personalizada não é necessária aqui.
Simplesmente usar a biblioteca asyncio
interna python é suficiente para executar solicitações assíncronas de qualquer tipo, além de fornecer fluidez suficiente para manipulação de erros complexa e específica de uso do usuário.
import asyncio
loop = asyncio.get_event_loop()
def do_thing(params):
async def get_rpc_info_and_do_chores(id):
# do things
response = perform_grpc_call(id)
do_chores(response)
async def get_httpapi_info_and_do_chores(id):
# do things
response = requests.get(URL)
do_chores(response)
async_tasks = []
for element in list(params.list_of_things):
async_tasks.append(loop.create_task(get_chan_info_and_do_chores(id)))
async_tasks.append(loop.create_task(get_httpapi_info_and_do_chores(ch_id)))
loop.run_until_complete(asyncio.gather(*async_tasks))
Como funciona é simples. Você está criando uma série de tarefas que gostaria de ocorrer de forma assíncrona e solicitando um loop para executar essas tarefas e sair após a conclusão. Nenhuma biblioteca extra sujeita a falta de manutenção, não há funcionalidade necessária.