Question

J'ai une tâche rake qui télécharge une liste de fichiers via ftp. Copier sans thread fonctionne bien, mais ce serait plus rapide si je pouvais effectuer plusieurs téléchargements simultanés. (Je suis novice en ruby ??et en multithreading, alors aucune surprise que cela ne fonctionne pas du tout au tout début.)

j'ai:

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

Mon résultat est:

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

Il semble donc que chaque fil commence à télécharger un fichier puis meurt sans erreur. Qu'est-ce que je fais mal?

Était-ce utile?

La solution 2

La racine du problème a été corrigée en ajoutant:

threads.each { |t| t.join }

après la fin de la boucle file_slice .

Merci à JRL de m'avoir aidé à trouver l'exception.

Autres conseils

Si abort_on_exception est false et que l'indicateur de débogage n'est pas activé (valeur par défaut), une exception non gérée annule le thread actuel. Vous ne le savez même pas jusqu'à ce que vous publiez une jointure sur le thread qui l'a soulevée. Ainsi, vous pouvez faire une jointure ou changer l’indicateur de débogage et vous devriez avoir l’exception si elle est lancée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top