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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top