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_sCondiciones 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 += 1en 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_sDevolver 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_sVariables 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.joinGestionar 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
endCuá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.newinicia la ejecución concurrente.joinespera;valueespera y devuelve un resultado.- Los hilos comparten memoria, lo que provoca condiciones de carrera.
- Un
Mutexconsynchronizeprotege 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.