Articulo de referencia

Bloqueo del intérprete global

Representación esquemática del funcionamiento de los hilos bajo GIL. Verde: hilo que mantiene el GIL; rojo: hilos bloqueados. Un bloqueo global del intérprete ( GIL ) es un meca...

Representación esquemática del funcionamiento de los hilos bajo GIL. Verde: hilo que mantiene el GIL; rojo: hilos bloqueados.

Un bloqueo global del intérprete ( GIL ) es un mecanismo utilizado en los intérpretes de lenguajes de programación para sincronizar la ejecución de hilos , de modo que solo un hilo nativo (por proceso) pueda ejecutar operaciones básicas (como la asignación de memoria y el conteo de referencias ) a la vez. [ 1 ] Como regla general, un intérprete que utiliza GIL verá solo un hilo para ejecutar a la vez, incluso si se ejecuta en un procesador multinúcleo , aunque algunas implementaciones prevén que el código intensivo en CPU libere el GIL, permitiendo que varios hilos utilicen varios núcleos. Algunos intérpretes populares que tienen un GIL son CPython y Ruby MRI .

conceptos de fondo técnico

Un bloqueo global del intérprete (GIL) es un bloqueo de exclusión mutua que mantiene un hilo intérprete de un lenguaje de programación para evitar compartir código que no sea seguro para hilos con otros hilos. En las implementaciones con un GIL, siempre hay un GIL para cada proceso intérprete .

Las aplicaciones que se ejecutan en implementaciones con GIL pueden diseñarse para usar procesos separados y así lograr un paralelismo completo, ya que cada proceso tiene su propio intérprete y, a su vez, su propio GIL. De lo contrario, el GIL puede representar una barrera importante para el paralelismo.

Ventajas

Entre las razones para emplear un bloqueo de intérprete global se incluyen:

  • mayor velocidad de los programas de un solo hilo (no es necesario adquirir ni liberar bloqueos en todas las estructuras de datos por separado),
  • fácil integración de bibliotecas C que normalmente no son seguras para subprocesos,
  • Facilidad de implementación (tener un único GIL es mucho más sencillo de implementar que un intérprete sin bloqueos o uno que utilice bloqueos de grano fino).

Una forma de sortear el GIL es crear un intérprete separado por hilo, lo cual resulta demasiado costoso en la mayoría de los lenguajes.

Desventajas

El uso de un bloqueo global del intérprete en un lenguaje limita efectivamente la cantidad de paralelismo alcanzable mediante la concurrencia de un único proceso intérprete con múltiples hilos. Si el proceso está compuesto casi exclusivamente de código interpretado y no realiza llamadas fuera del intérprete que se bloqueen durante largos períodos de tiempo (lo que permite que el GIL sea liberado por ese hilo mientras procesa), es probable que haya muy poco aumento de velocidad al ejecutar el proceso en una máquina multiprocesador . Debido a la señalización con un hilo limitado por la CPU, puede causar una ralentización significativa, incluso en procesadores individuales. [ 2 ] Más grave aún, cuando el único hilo nativo llama a un proceso del sistema operativo que se bloquea (como el acceso al disco), todo el proceso se bloquea, aunque otros hilos de la aplicación puedan estar esperando.

Ejemplos

Algunas implementaciones de lenguaje que implementan un bloqueo global del intérprete son CPython , la implementación más utilizada de Python , [ 3 ] [ 4 ] y Ruby MRI , la implementación de referencia de Ruby (donde se llama Bloqueo Global de la VM).

Los equivalentes de estos lenguajes basados ​​en JVM ( Jython y JRuby ) no utilizan bloqueos de intérprete globales. IronPython e IronRuby se implementan sobre el Dynamic Language Runtime de Microsoft y también evitan el uso de un GIL. [ 5 ]

Un ejemplo de lenguaje interpretado sin GIL es Tcl , que se utiliza en la herramienta de evaluación comparativa HammerDB . [ 6 ]

Código de ejemplo

Código de ejemplo en Python . Observe cómo se adquiere y se libera un bloqueo entre cada llamada a una instrucción. Utiliza el objeto Lock del módulo threading . [ 7 ]

from threading import LockTABLA_DE_INSTRUCCIONES = { ... }def execute ( bytecode : list ) -> None : """Ejecutar bytecode.""" lock = Lock () for ( opcode , args ) in bytecode : lock . acquire () INSTRUCTION_TABLE [ opcode ]( args ) lock . release ()

Desarrollos recientes

Compilación multihilo (Python 3.13 y versiones posteriores)

En Python 3.13, se introdujo una versión experimental de CPython con soporte para subprocesos libres como parte de la PEP 703: Hacer opcional el bloqueo global del intérprete en CPython . Esta versión permite a los desarrolladores compilar Python sin el bloqueo global del intérprete (GIL), lo que posibilita la ejecución paralela real del código de bytes de Python en múltiples núcleos de CPU. Esta característica aún es experimental, pero representa un paso importante hacia una mejor concurrencia en futuras versiones de Python. [ 8 ]

Véase también

Referencias

  1. "GlobalInterpreterLock" . Wiki de Python . Consultado el 30 de noviembre de 2015 .
  2. David Beazley (11 de junio de 2009). "Dentro del GIL de Python" (PDF) . Chicago: Chicago Python User Group . Recuperado el 7 de octubre de 2009 .
  3. Shannon-jj Behrens (3 de febrero de 2008). "Concurrencia y Python" . Dr. Dobb's Journal . pág. 2. Consultado el 12 de julio de 2008. El GIL es un bloqueo que se utiliza para proteger todas las secciones críticas en Python. Por lo tanto, incluso si se tienen varias CPU, solo un hilo puede estar haciendo cosas propias de Python a la vez. 
  4. "Manual de referencia de la API de Python/C: Estado del hilo y bloqueo global del intérprete" . Archivado del original el 14 de septiembre de 2008. Consultado el 15 de agosto de 2014 .
  5. "IronPython en python.org" . python.org . Consultado el 4 de abril de 2011. IronPython no tiene GIL y el código multihilo puede usar procesadores multinúcleo.
  6. "Conceptos y arquitectura de HammerDB" . HammerDB. 30 de noviembre de 2018. Consultado el 10 de mayo de 2020. Es importante comprender desde el principio que HammerDB está escrito en TCL debido a las capacidades únicas de subprocesos que ofrece TCL.
  7. "threading — Paralelismo basado en hilos" . Documentación de Python . Consultado el 16 de abril de 2025 .
  8. "PEP 703 – Hacer que el bloqueo global del intérprete sea opcional en CPython | peps.python.org" . Propuestas de mejora de Python (PEP) . Consultado el 13 de noviembre de 2025 .