Python Async, ¿por qué todavía no es algo mainstream?
(tonybaloney.github.io)Python Async, ¿por qué todavía no es algo mainstream?
asyncio de Python es una herramienta poderosa que puede reducir los tiempos de espera y aumentar de forma drástica la eficiencia de un programa en entornos con muchas tareas de I/O (entrada/salida). Sin embargo, a pesar de sus varias ventajas, no todos los desarrolladores de Python lo usan activamente, y hay algunas razones de fondo para ello.
1. Se vuelve más difícil de manejar mentalmente: carga cognitiva
La barrera más grande es la complejidad. El código síncrono es intuitivo porque podemos seguir el flujo de ejecución de arriba hacia abajo, en orden, como si estuviéramos leyendo un libro.
Pero el código asíncrono es diferente. Es como un cocinero que, mientras hierve la pasta para preparar un plato (tiempo de espera), al mismo tiempo hace la salsa y, en los ratos libres, corta las verduras. Al final puede terminar la comida más rápido, pero en la cabeza del cocinero hay que estar pendiente constantemente de varias tareas: “¿qué tan cocida va la pasta?”, “¿no se estará quemando la salsa?”, etc.
Como el flujo de ejecución del código va saltando de un lado a otro, se vuelve difícil entender qué tarea se está ejecutando en ese momento y cuál está en espera. Esto hace que el proceso de depuración, especialmente cuando aparece un bug, sea mucho más complicado para rastrear la causa.
2. Un ecosistema dividido: compatibilidad de librerías
Otro problema de Python es que su ecosistema de librerías está dividido entre “síncrono” y “asíncrono”. Muchas librerías famosas y convenientes (por ejemplo, la librería estándar de peticiones HTTP requests o muchos ORM) solo funcionan de manera síncrona.
Si usas mal una librería síncrona dentro de código asíncrono, durante la ejecución de ese código síncrono se detiene por completo el “event loop”, que es justamente la mayor ventaja del modelo asíncrono. Es como construir varios carriles y terminar usando solo uno, así que deja de tener sentido usar async. Para resolver este problema hay que aprender y adoptar librerías aparte con soporte asíncrono (aiohttp, asyncpg, etc.), y eso vuelve más empinada la curva de aprendizaje.
3. Solo golpea a uno a la vez: GIL (bloqueo global del intérprete)
El GIL (Global Interpreter Lock) es una de las características problemáticas más conocidas de Python: incluso si hay varios hilos dentro de un mismo proceso, limita la ejecución a un solo hilo a la vez. Como asyncio funciona en un solo hilo, no choca directamente con el GIL, pero la existencia del GIL sí limita el alcance de uso de async.
asyncio está optimizado para aprovechar los tiempos de espera de I/O (esperar respuestas de red, esperar lectura de archivos, etc.). Pero si dentro de una función async se incluye una tarea intensiva de CPU con cálculos muy complejos, todo el event loop se detiene hasta que ese cálculo termina. Durante ese tiempo, las demás tareas de I/O no pueden hacer nada y solo les queda esperar. En última instancia, para trabajos que sí requieren paralelismo real, sigue existiendo la limitación de tener que usar otras tecnologías como multiprocessing.
4. Una esperanza para el futuro: Python 3.14 y la eliminación del GIL
Pero hay noticias muy prometedoras sobre estas limitaciones. Se trata del movimiento hacia la eliminación opcional del GIL, introducido de forma experimental desde Python 3.13 y que se espera que madure más en la versión 3.14.
Este cambio, impulsado mediante la propuesta PEP 703, busca permitir que los desarrolladores puedan ejecutar código Python sin GIL si así lo desean. Si esto se vuelve realidad, Python podrá habilitar multithreading real, donde varios hilos aprovechen varios núcleos de CPU al mismo tiempo.
Esto podría generar una sinergia enorme cuando se use junto con asyncio. Las tareas de I/O podrían manejarse eficientemente con asyncio, mientras que las tareas de CPU más pesadas podrían enviarse a hilos separados para procesarse en paralelo sin las restricciones del GIL. Se espera que este cambio marque un gran punto de inflexión para el ecosistema de Python y derribe muchas de las barreras que han frenado la adopción de la programación async.
Aún no hay comentarios.