Cuando descubrí los hilos por primera vez, intenté comprobar que realmente funcionaban como se esperaba al invocar el modo reposo en varios subprocesos, en lugar de llamar a reposo normalmente. Funcionó, y yo estaba muy feliz.¿Qué uso puedo darle a los hilos Ruby, si no son realmente paralelos?
Pero luego un amigo mío me dijo que estos hilos no eran realmente paralelos, y que dormir debe estar fingiendo.
Así que ahora me escribió esta prueba para hacer algo de procesamiento real:
class Test
ITERATIONS = 1000
def run_threads
start = Time.now
t1 = Thread.new do
do_iterations
end
t2 = Thread.new do
do_iterations
end
t3 = Thread.new do
do_iterations
end
t4 = Thread.new do
do_iterations
end
t1.join
t2.join
t3.join
t4.join
puts Time.now - start
end
def run_normal
start = Time.now
do_iterations
do_iterations
do_iterations
do_iterations
puts Time.now - start
end
def do_iterations
1.upto ITERATIONS do |i|
999.downto(1).inject(:*) # 999!
end
end
end
y ahora estoy muy triste, porque run_threads() no sólo no obtienen mejores resultados que run_normal, fue incluso más lento!
Entonces, ¿por qué debería complicar mi aplicación con subprocesos, si no son realmente paralelos?
** ACTUALIZACIÓN **
@ fl00r dijo que podía tomar ventaja de las discusiones si he usado para tareas de IO, por lo que escribió dos más variaciones de do_iterations:
def do_iterations
# filesystem IO
1.upto ITERATIONS do |i|
5.times do
# create file
content = "some content #{i}"
file_name = "#{Rails.root}/tmp/do-iterations-#{UUIDTools::UUID.timestamp_create.hexdigest}"
file = ::File.new file_name, 'w'
file.write content
file.close
# read and delete file
file = ::File.new file_name, 'r'
content = file.read
file.close
::File.delete file_name
end
end
end
def do_iterations
# MongoDB IO (through MongoID)
1.upto ITERATIONS do |i|
TestModel.create! :name => "some-name-#{i}"
end
TestModel.delete_all
end
Los los resultados de rendimiento siguen siendo los mismos: normales> hilos.
Pero ahora no estoy seguro de si mi VM puede usar todos los núcleos. Volveremos cuando lo haya probado.
hilos chupa, Fibras rocas! : D – fl00r
Enlazar es falso si usa ruby oficial, pero para jruby y rubinius, creo que es un enhebrado real. – texasbruce
El rendimiento no es la única razón para usar subprocesos. Ver mi respuesta – Phrogz