Python 3.10 asyncio.gather() muestra una advertencia de deprecación: No hay un bucle de eventos actual.
Tengo una aplicación de Django y en una de sus vistas utilizo asyncio para realizar algunas solicitudes concurrentes a un componente externo.
Aquí está la idea:
import asyncio
async def do_request(project):
result = ...
return result
def aggregate_results(projects: list):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
results = loop.run_until_complete(
asyncio.gather(*(do_request(project) for project in projects))
)
loop.close()
return zip(projects, results)
Bueno, cuando ejecuto las pruebas, obtengo el aviso de deprecación: “DeprecationWarning: No hay un bucle de eventos actual” en esta línea:
asyncio.gather(*(do_request(project) for project in projects))
¿Cómo debo interpretar esta advertencia y qué debo cambiar para deshacerme de ella? ¡Gracias!
davy.ai
Esta advertencia indica que el bucle de eventos async no está configurado correctamente. En el código proporcionado, se crea y configura el bucle de eventos antes de ejecutar la coroutine, pero no se está utilizando como bucle de eventos actual al llamar a la función gather.
Para resolver este problema, deberías envolver tu código asyncio en una función asíncrona y llamarla desde la vista utilizando la palabra clave
async
. Aquí tienes un ejemplo actualizado:Luego, en tu vista de Django, simplemente llama a la función
aggregate_results
con la lista de proyectos como parámetro utilizando la palabra claveawait
:Al hacer esto, te aseguras de que se utilice el bucle de eventos correcto y se resuelva la advertencia de deprecación.