Ruby Threads (Rake) para FTP
-
06-07-2019 - |
Pregunta
Tengo una tarea de rastrillo que carga una lista de archivos a través de ftp. Copiar sin subprocesos funciona bien, pero sería más rápido si pudiera hacer varias cargas simultáneas. (Soy nuevo en ruby ??y multihilo, así que no es de extrañar que no funcionó de inmediato).
Tengo:
files.each_slice(files.length / max_threads) do |file_set|
threads << Thread.new(file_set) do |file_slice|
running_threads += 1
thread_num = running_threads
thread_num.freeze
puts "making thread # #{thread_num}"
file_slice.each do |file|
file.freeze
if File.directory?(file)
else
puts file.pathmap("#{$ftpDestination}%p")
ftp.putbinaryfile(file, file.pathmap("#{$ftpDestination}%p"))
end
end
end
end
Mi salida es:
making thread # 1
/test/./1column-ff-template.aspx
making thread # 2
making thread # 3
/test/./admin/footerContent.aspx
/test/./admin/contentList.aspx
making thread # 4
/test/./3columnTemplate.ascx
making thread # 5
/test/./ascx/dashboard/dash.ascx
making thread # 6
/test/./ascx/Links.ascx
making thread # 7
/test/./bin/App_GlobalResources.dll
making thread # 8
/test/./bin/App_Web__foxtqrr.dll
making thread # 9
/test/./GetPageLink.ascx
Entonces parece que cada hilo comienza a cargar un archivo y luego muere sin un error. ¿Qué estoy haciendo mal?
Solución 2
La raíz del problema se solucionó agregando:
threads.each { |t| t.join }
después de que finalice el bucle file_slice
.
¡Gracias a JRL por ayudarme a encontrar la excepción!
Otros consejos
Si abort_on_exception
es falso y el indicador de depuración no está habilitado (predeterminado), una excepción no controlada mata el hilo actual. Ni siquiera lo sabe hasta que emite una unión en el hilo que lo generó. Por lo tanto, puede unirse o cambiar el indicador de depuración y debería obtener la excepción si realmente se lanza uno.