El GVL explicado
Por qué los hilos están limitados
El GVL explicado es una lección gratuita de Ruby Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Ruby Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Ruby Academy incluye 4 lecciones en total.
¿Qué es el GVL?
El GVL (Global VM Lock, históricamente GIL) es un bloqueo interno de CRuby, el intérprete estándar de Ruby.
- Permite que solo un hilo ejecute código Ruby cada vez.
- Protege las partes internas del intérprete frente a daños causados por la ejecución concurrente.
- Esto significa que el trabajo de CPU escrito únicamente en Ruby no se ejecuta realmente en paralelo en varios núcleos.
Comprender el GVL permite saber cuándo ayudan los hilos y cuándo no.
Por qué existe
Las partes internas de CRuby (asignación de objetos, recolección de basura y extensiones de C) no se diseñaron todas para ser seguras frente a hilos. El GVL las hace seguras serializando la ejecución de Ruby.
Eliminarlo correctamente es difícil, por lo que CRuby lo conserva. JRuby y TruffleRuby no tienen GVL y pueden ejecutar hilos en varios núcleos.
Trabajo limitado por CPU
Para tareas limitadas por CPU (cálculos matemáticos, ordenación y análisis), los hilos no aceleran el trabajo en CRuby. Solo un hilo ejecuta código Ruby en cada instante, por lo que dos hilos de CPU equivalen aproximadamente a un hilo más la sobrecarga.
def heavy
sum = 0
1_000_00.times { |i| sum += i }
sum
end
puts heavy
puts "CPU work does not parallelize under the GVL"La E/S libera el GVL
La idea clave es que la E/S bloqueante libera el GVL. Cuando un hilo se suspende, lee un archivo o espera en un socket, suelta el bloqueo para que otro hilo pueda ejecutar Ruby.
Por eso los hilos son excelentes para el trabajo limitado por E/S incluso con el GVL.
Solapamiento de esperas
Aquí, tres hilos se suspenden mediante sleep. Como sleep libera el GVL, las esperas se solapan. El tiempo total es de aproximadamente 0,2 s, no de 0,6 s.
start = Time.now
threads = (1..3).map do
Thread.new { sleep 0.2 }
end
threads.each(&:join)
elapsed = Time.now - start
puts "Elapsed roughly: " + elapsed.round(1).to_sLas extensiones de C pueden liberarlo
Las extensiones de C bien escritas pueden liberar el GVL durante cálculos nativos prolongados mediante rb_thread_call_without_gvl. Esto permite que el trabajo nativo intensivo se ejecute en paralelo mientras los hilos de Ruby continúan.
Por ello, algunas bibliotecas consiguen paralelismo real incluso en CRuby.
Los hilos siguen cambiando
Incluso con trabajo de CPU, el GVL no congela los demás hilos para siempre. CRuby adelanta periódicamente la ejecución de un hilo para que cada uno tenga su turno. El trabajo es concurrente (intercalado), pero no paralelo (simultáneo).
results = []
mutex = Mutex.new
threads = (1..3).map do |n|
Thread.new do
mutex.synchronize { results << n }
end
end
threads.each(&:join)
puts "Collected: " + results.sort.join(", ")Concurrencia frente a paralelismo
Hay dos términos importantes:
- Concurrencia: las tareas avanzan intercalando su ejecución. El GVL lo permite.
- Paralelismo: las tareas se ejecutan exactamente en el mismo instante en núcleos diferentes. El GVL lo impide para el código Ruby.
Los hilos le proporcionan concurrencia; los Ractors le proporcionan paralelismo.
Cómo evitar el GVL
Para utilizar varios núcleos con trabajo de CPU en CRuby, puede:
- Ejecutar varios procesos (cada uno tiene su propio GVL).
- Usar Ractors para obtener paralelismo dentro del proceso.
- Delegar el trabajo en extensiones de C que liberen el GVL.
Para el trabajo de E/S, los hilos normales suelen ser suficientes.
Los procesos no comparten el GVL
Cada proceso del sistema operativo ejecuta su propia máquina virtual de Ruby con su propio GVL. Crear procesos mediante fork proporciona paralelismo real, pero los procesos no comparten memoria y utilizan más recursos.
puts "Main pid: " + Process.pid.to_s
puts "Each forked process has its own independent GVL"Elegir una estrategia
Guía de decisión:
- ¿Hay mucha espera? Utilice hilos.
- ¿La CPU está muy ocupada y desea utilizar varios núcleos? Use procesos o Ractors.
- ¿Necesita un estado compartido? Use hilos con un
Mutex, pero tenga en cuenta las limitaciones del GVL.
Conocer el GVL evita el error clásico de esperar que los hilos de CPU escalen linealmente.
Comprobación rápida
Compruebe su comprensión del GVL.
Repaso: el GVL
Ideas clave sobre el Global VM Lock:
- En CRuby, solo un hilo ejecuta código Ruby cada vez.
- Protege las partes internas del intérprete.
- La E/S bloqueante lo libera, lo que permite solapar esperas.
- El trabajo de Ruby limitado por CPU no se paraleliza entre varios núcleos.
- Use procesos o Ractors para obtener paralelismo real.
A continuación, veremos las fibras para obtener concurrencia cooperativa y ligera.
Preguntas frecuentes
¿La lección «El GVL explicado» es gratis?
Sí — el texto completo de «El GVL explicado» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Ruby Academy, actualiza a CoddyKit PRO. El curso de Ruby Academy incluye 4 lecciones en total.
¿Qué aprenderé en «El GVL explicado»?
Por qué los hilos están limitados Practicas Ruby Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Ruby Academy?
No se requiere experiencia previa. Ruby Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «El GVL explicado»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Ruby Academy?
Sí. Cada lección de Ruby Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.