es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , ,

Answer

  1. Avatar for 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:

    import asyncio
    
    
    async def do_request(project):
        result = ...
    
        return result
    
    
    async def aggregate_results(projects: list):
        results = await asyncio.gather(*(do_request(project) for project in projects))
    
        return list(zip(projects, results))
    

    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 clave await:

    async def my_view(request):
        projects = ...
    
        results = await aggregate_results(projects)
    
        return render(request, 'my_template.html', {'results': results})
    

    Al hacer esto, te aseguras de que se utilice el bucle de eventos correcto y se resuelva la advertencia de deprecación.

Comments are closed.