CodeGym /Cursos /Python SELF ES /Gestores de contexto asíncronos

Gestores de contexto asíncronos

Python SELF ES
Nivel 26 , Lección 2
Disponible

9.1 Gestores de contexto

¿Te acuerdas de cómo usábamos el operador with para controlar el acceso a un recurso? Con él, podíamos rastrear exactamente cuándo se empezó a usar un recurso y cuándo terminó el proceso. Lo mismo se puede hacer para los "recursos asíncronos".

Los gestores de contexto asíncronos (AsyncContextManager) se usan para manejar recursos en programación asíncrona, asegurando una correcta apertura y cierre de recursos en funciones asíncronas. Funcionan de manera similar a los gestores de contexto normales, pero están diseñados para ser usados en funciones asíncronas con las palabras clave async with.

No voy a entrar mucho en detalles sobre esto, ya que en el futuro cercano probablemente no estarás creando tus propios gestores de contexto asíncronos, y para cuando decidas hacerlo, de todos modos habrás olvidado todo. Pero quiero que te familiarices con el concepto.

Creando un gestor de contexto asíncrono

Los gestores de contexto asíncronos se definen usando los métodos __aenter__ y __aexit__. Estos métodos son similares a los métodos __enter__ y __exit__ en los gestores de contexto normales, pero son asíncronos.

  • __aenter__(): Método asíncrono, llamado al entrar en el contexto.
  • __aexit__(exc_type, exc, tb): Método asíncrono, llamado al salir del contexto. Acepta tres argumentos: tipo de excepción, la propia excepción y la traza (traceback).

Ejemplo de creación de un gestor de contexto asíncrono


import asyncio

class AsyncContextManager:
    async def __aenter__(self):
        print("Enter context")
        return self
        
    async def __aexit__(self, exc_type, exc, tb):
        print("Exit context")
        
async def main():
    async with AsyncContextManager():
        print("Inside context")
        
asyncio.run(main())

Así es como se ejecutará este código:

  1. La función main() se lanzará de manera asíncrona
  2. La función main() comenzará a ejecutarse
  3. Se creará un objeto de tipo AsyncContextManager
  4. El método __aenter__() se llamará en el objeto AsyncContextManager
  5. Se imprimirá print("Enter context")
  6. Se ejecutará el código print("Inside context")
  7. El método __aexit__() se llamará en el objeto AsyncContextManager
  8. La ejecución de la función main() terminará

9.2 Ejemplos de uso

En el ejemplo anterior, no es necesario usar una versión asíncrona del gestor de contexto: el código funcionará incluso si se hace sincrónico.

Pero se necesita un gestor asíncrono si dentro del bloque with se llama a una función asíncrona o se utiliza el operador await.

Gestor de contexto asíncrono para trabajar con archivos

En este ejemplo se usa la biblioteca aiofiles para la lectura y escritura asíncrona de archivos. El gestor de contexto asíncrono aiofiles.open permite abrir y cerrar archivos de manera segura en un contexto asíncrono.


import aiofiles
import asyncio
            
async def main():
    async with aiofiles.open('example.txt', mode='w') as file:
        await file.write('Hello, world!')
            
asyncio.run(main())

Gestor de contexto asíncrono para operaciones de red

En este ejemplo se utiliza la biblioteca aiohttp para realizar solicitudes HTTP asíncronas. Los gestores de contexto asíncronos ClientSession y session.get aseguran la correcta gestión de las conexiones.


import aiohttp
import asyncio
            
async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()
            
async def main():
    html = await fetch('https://example.com')
    print(html)
            
asyncio.run(main())

Los gestores de contexto asíncronos proporcionan gestión automática de recursos, tales como archivos, conexiones de red y otros recursos que necesitan ser abiertos y cerrados.

Los métodos __aenter__ y __aexit__ permiten realizar operaciones asíncronas al entrar y salir del contexto, asegurando la ejecución paralela de tareas. El uso de gestores de contexto asíncronos ayuda a evitar fugas de recursos y garantiza que todos los recursos sean liberados correctamente.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION