BookinglyTech News
Software

Python 3.14 y 3.15 añaden herramientas para orquestar recursos concurrentes

El artículo muestra cinco técnicas con la librería estándar que permiten limitar y limpiar recursos en aplicaciones asíncronas, usando TaskGroup, Semaphore y AsyncExitStack.

2 min de lecturaKDnuggets0 vistas

Python ya ofrece varios mecanismos para ejecutar I/O en paralelo, pero la verdadera dificultad en producción es controlar un conjunto finito de recursos bajo concurrencia. Con la llegada de Python 3.14 (octubre 2025) y el soporte oficial del free‑threaded bajo el PEP 779, y la versión 3.15 en beta que introduce TaskGroup.cancel(), la gestión estructurada y segura se vuelve más sencilla.

1. asyncio.TaskGroup para concurrencia estructurada

asyncio.gather deja tareas huérfanas si alguna falla; TaskGroup (añadido en 3.11) garantiza que, al salir del bloque async with, todas las tareas hayan terminado o sido canceladas. El ejemplo del artículo crea una tarea por usuario y espera a que todas terminen antes de devolver los dashboards, evitando fugas de tareas.

2. asyncio.Semaphore para limitar el uso de recursos

El grupo controla la corrección, pero no la capacidad. Un Semaphore por backend, inicializado con la capacidad real del servicio, bloquea la apertura de nuevas conexiones hasta que haya espacio. El código comparte los semáforos a nivel de módulo, de modo que, aunque 30 usuarios soliciten simultáneamente el modelo de riesgo (capacidad 3), nunca se superará ese límite.

3. contextlib.AsyncExitStack para limpieza dinámica

Cuando el número de recursos a abrir depende de flags o configuraciones en tiempo de ejecución, AsyncExitStack permite registrar una cantidad arbitraria de contextos asíncronos y garantiza su cierre en orden inverso al salir del bloque. Así se pueden abrir conexiones a los backends habilitados sin escribir lógica manual de try/finally.

4. Herramientas de introspección de Python 3.14

La sección cinco del artículo usa la nueva API de introspección de 3.14 para inspeccionar objetos de corrutina y depurar cuellos de botella, aunque el resto de las técnicas funciona con 3.11 o superior.

5. Compatibilidad y pruebas reales

El autor probó las cinco técnicas contra un simulador que reproduce un dashboard interno que consulta cuatro servicios con diferentes capacidades. Con 30 peticiones concurrentes, los semáforos mantuvieron los límites exactos y TaskGroup evitó tareas huérfanas. Los resultados son medidos, no estimados, y el código no depende de librerías externas.

Estas prácticas ya están disponibles en la librería estándar, por lo que no requieren dependencias adicionales. Adoptarlas mejora la predictibilidad y la robustez de los servicios asíncronos, algo crítico cuando se despliegan en entornos de producción con alta carga.

En resumen, con Python 3.14/3.15 basta con usar la API estándar para orquestar recursos de forma segura; la clave está en combinar TaskGroup, Semaphore y AsyncExitStack según el caso de uso.