0Pricing
Ruby Academy · Lección

Hilos

Ejecución concurrente

Hilos es una lección gratuita de Ruby Academy en CoddyKit. Esta es la lección 1 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 un hilo?

Un hilo es una ruta de ejecución independiente dentro de su programa. Ruby le permite ejecutar varios hilos para que el trabajo se solape en el tiempo.

  • El programa principal se ejecuta en el hilo principal.
  • Puede crear más hilos con Thread.new.
  • Los hilos comparten la misma memoria, por lo que pueden leer y escribir las mismas variables.

Los hilos son ideales cuando su programa pasa tiempo esperando (red, disco o suspensión), porque un hilo puede esperar mientras otro sigue trabajando.

Crear un hilo

Pase un bloque a Thread.new. El bloque se ejecuta en un hilo nuevo. Llame a join para esperar a que termine antes de que finalice el programa.

t = Thread.new do
  puts "Hello from the new thread"
end

t.join
puts "Main thread done"

Por qué importa join

Cuando termina el hilo principal, Ruby sale y puede que no espere a los demás hilos. join bloquea al llamador hasta que termina el hilo de destino.

Sin join, es posible que el hilo de trabajo nunca tenga la oportunidad de imprimir antes de que finalice el programa.

t = Thread.new do
  sleep 0.1
  puts "Worker finished"
end

puts "Waiting..."
t.join
puts "All done"

Varios hilos a la vez

Puede iniciar un grupo de hilos, recopilarlos en un arreglo y después aplicar join a cada uno. Este es un patrón habitual para realizar trabajo de E/S casi en paralelo.

threads = (1..3).map do |n|
  Thread.new do
    puts "Thread number " + n.to_s
  end
end

threads.each(&:join)
puts "Finished all threads"

Compartir variables

Los hilos comparten memoria. Una variable definida antes del hilo está disponible dentro de él. Esto es potente, pero también peligroso si dos hilos escriben el mismo valor.

counter = 0

t = Thread.new do
  counter += 1
end

t.join
puts "Counter is " + counter.to_s

Condiciones de carrera

Una condición de carrera ocurre cuando los hilos intercalan actualizaciones de datos compartidos y el resultado depende del momento en que se ejecutan.

  • counter += 1 en realidad consiste en leer, sumar y escribir.
  • Dos hilos pueden leer el mismo valor antiguo y escribir ambos el mismo valor nuevo, con lo que se pierde un incremento.

La solución es coordinar el acceso mediante un bloqueo.

Mutex: un bloqueo

Un Mutex (exclusión mutua) garantiza que solo un hilo ejecute el código protegido cada vez. Encierre la sección crítica en mutex.synchronize.

mutex = Mutex.new
counter = 0

threads = (1..5).map do
  Thread.new do
    mutex.synchronize do
      counter += 1
    end
  end
end

threads.each(&:join)
puts "Counter is " + counter.to_s

Devolver un valor

Thread#value espera a que termine el hilo y devuelve el valor de su bloque, como un join automático más un resultado.

t = Thread.new do
  2 + 3
end

puts "Result is " + t.value.to_s

Variables locales al hilo

Cada hilo puede almacenar sus propios valores asociados a un símbolo mediante Thread.current[:key]. Estos valores son privados de ese hilo y nunca se comparten.

t = Thread.new do
  Thread.current[:name] = "worker"
  puts "Inside: " + Thread.current[:name]
end

t.join

Gestionar excepciones

Si un hilo genera un error, este permanece silencioso hasta que llama a join o value, que lo vuelve a generar. Establecer Thread.abort_on_exception = true hace que los errores bloqueen todo el programa de inmediato, lo que facilita la depuración.

t = Thread.new do
  raise "boom"
end

begin
  t.join
rescue => e
  puts "Caught: " + e.message
end

Cuándo ayudan los hilos

Los hilos son excelentes para el trabajo limitado por E/S, en el que se pasa tiempo esperando. Ayudan menos con el trabajo limitado por CPU debido al GVL, que se explica a continuación.

  • Buenos casos: descargar muchas URL y leer muchos archivos.
  • Limitados: realizar cálculos numéricos intensivos en varios núcleos.

Proteja siempre el estado mutable compartido con un Mutex.

Comprobación rápida

Compruebe su comprensión de los hilos.

Repaso: hilos

Ha aprendido los conceptos esenciales de los hilos de Ruby:

  • Thread.new inicia la ejecución concurrente.
  • join espera; value espera y devuelve un resultado.
  • Los hilos comparten memoria, lo que provoca condiciones de carrera.
  • Un Mutex con synchronize protege el estado compartido.
  • Los hilos son excelentes para el trabajo limitado por E/S.

A continuación, exploraremos por qué los hilos no pueden utilizar por completo varios núcleos de CPU: el GVL.

Preguntas frecuentes

¿La lección «Hilos» es gratis?

Sí — el texto completo de «Hilos» 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 «Hilos»?

Ejecución concurrente 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 1 de 4.

¿Cuánto tiempo toma la lección «Hilos»?

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.

Todas las lecciones de este curso

  1. Hilos
  2. El GVL explicado
  3. Fibras
  4. Ractors
← Volver a Ruby Academy