Ruby Threads (Rake) pour FTP
-
06-07-2019 - |
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?
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.