La llamada a Thread.join bloquea la hebra actual (principal). Sin embargo, los resultados de la combinación de llamadas en todos los subprocesos generados no se eliminarán cuando el hilo principal salga. ¿Cómo se generan hilos de niños persistentes en Ruby sin bloquear el hilo principal?Thread.join bloquea la hebra principal
Aquí hay un uso típico de join.
for i in 1..100 do
puts "Creating thread #{i}"
t = Thread.new(i) do |j|
sleep 1
puts "Thread #{j} done"
end
t.join
end
puts "#{Thread.list.size} threads"
Esto da
Creating thread 1 Thread 1 done Creating thread 2 Thread 2 done ... 1 threads
pero estoy buscando la manera de conseguir este
Creating thread 1 Creating thread 2 ... 101 threads Thread 1 done Thread 2 done ...
El código da la misma salida, tanto en Rubí 1.8.7 y 1.9.2
Sí, eso funciona. Hubiera pensado que Ruby tendría una forma de manejar esto implícitamente en lugar de tener que hacer un seguimiento de los hilos y realizar una llamada de unión al final. Y sí, no debería usar el global i dentro de cada hilo. Cosas básicas. Gracias por la corrección. Actualizaré el código. – Alkaline
En Ruby 1.9, los parámetros de bloque son siempre locales, por lo que no necesitaría cambiar el nombre de la variable. Aunque recibirías una advertencia. (* Variable 'i' sombras variable externa * o algo así.) –