Python: hilos, concurrencia y algunos temas avanzados

De qué va este post?

Explicación sencilla de cómo maneja Python el paralelismo, la concurrencia y los hilos.

Python y su inexistente paralelismo

Supongo que todos sabéis que son los hilos, verdad? Es un concepto multi-lenguaje de programación. Python, como no podía ser menos también nos permite usar hilos… O no?

Pero… Cómo que NO, si Python tiene la librería threading que nos permite crear hilos?

Efectivamente, la librería existe. Pero, es una de las grandes “mentirijillas” de Python 🙂

Por qué Python nos “miente”, qué le he hecho yo?

A modo de culturilla:

Cuando Guido van Rossum (creador de Python) ideó y diseño Python, tenía muy clara una cosa: tenía que ser muy simple. No solo el lenguaje, también el intérprete.

Con esta idea en la cabeza, creó el intérprete sin soporte para hilos. Pero, con los años, los años los programadores reclamaban más y más el soporte de hilos.

Pero claro, la inclusión de hilos suponía complicar el intérprete. Y mucho. Pero… por qué? Porque el paralelismo tiene, ente otros muchos problemas a solucionar:

  • Sincronización
  • Condiciones de carrera
  • Interbloqueos
  • Fugas de memoria

Python y los falsos “hilos”

Pese a todo, los programadores seguían reclamando hilos. Así que lo solucionaron de la siguiente manera:

  • Crearon el GIL (Global Python Interpreter).
  • Crearon una librería que permitía al programador usar un API para la creación y gestión hilos.

Vale… y es esto qué es? 🙂

El GIL

Como ya hemos comentado, la inclusión de hilos supone mucho esfuerzo y complicación del intérprete. El GIL lo que hace es SIMULAR la ejecución de hilos. Es decir:

  • Python crea 1 proceso y 1 hilo por defecto. Cualquier programa que hagamos, se ejecutará en este contexto.
  • Si creamos más hilos Python y el GIL lo que harán será ir cambiando la ejecución de cada hilo en el procesador. De tal manera que SOLO se ejecuta un hilo a la vez. Es decir, que lograremos concurrencia pero NO paralelismo, como nos dice la intuición.

Vaya KK, verdad? 🙂 la verdad es que cuando te enteras de esto la primera vez, te quedas bastante decepcionado. Al menos yo me quedé pensando: pero qué tipo de lenguaje de mi***da es esta?!?! 🙂

Tened cuenta lo que os comentaba más arriba: Python fue creado para ser simple. En todos los aspectos. Esto no tiene que ser necesariamente malo, todo depende de lo que necesitemos. Por ejemplo, no se me ocurrirá escribir un sistema operativo o sistema el control de un misil en Python 🙂

A pesar del GIL, en general, con Python podremos hacer la mayor parte de cosas que se nos pasen por la cabeza, no preocuparse 🙂

Sobreviviendo al GIL