Tengo muchos problemas con la mayoría de las respuestas publicadas: o usan bibliotecas obsoletas que se han portado con funciones limitadas o proporcionan una solución con demasiada magia en la ejecución de la solicitud, lo que dificulta el manejo de errores. Si no entran en una de las categorías anteriores, son bibliotecas de terceros o están en desuso.
Algunas de las soluciones funcionan bien únicamente en solicitudes http, pero las soluciones se quedan cortas para cualquier otro tipo de solicitud, lo cual es ridículo. Aquí no es necesaria una solución altamente personalizada.
El simple uso de la biblioteca incorporada de Python asyncio
es suficiente para realizar solicitudes asíncronas de cualquier tipo, además de proporcionar suficiente fluidez para el manejo de errores complejos y de casos de uso específicos.
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))
El funcionamiento es simple. Está creando una serie de tareas que le gustaría que ocurrieran de forma asíncrona y luego solicita un ciclo para ejecutar esas tareas y salir al finalizar. No hay bibliotecas adicionales sujetas a falta de mantenimiento, no se requiere falta de funcionalidad.