J'ai une tâche rake qui télécharge une liste de fichiers via ftp. La copie sans thread fonctionne très bien, mais ce serait plus rapide si je pouvais faire plusieurs téléchargements simultanés. (Je suis nouveau à ruby et multithreading, donc pas de surprise, il n'a pas fonctionné dès le départ.)Ruby Threads (Rake) pour FTP
Je:
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
Ma sortie 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 thread commence à télécharger un fichier puis meurt sans erreur. Qu'est-ce que je fais de mal?
Parfait! Je ne savais même pas sur le drapeau de débogage. – willoller
@JRL: Ajout de $ DEBUG = true, et abort_on_exception. Je suis arrivé à l'erreur, qui est "flux IOError fermé". Je pensais que c'était un problème de verrouillage, mais cela arrive même quand je n'ai qu'un fil - un autre conseil? Merci! – willoller
@willoller: appelez-vous File.open avec un bloc associé? Si c'est le cas, le fichier sera automatiquement fermé à la fin du bloc. Si vous ne le souhaitez pas, n'associez pas un bloc à l'appel de la méthode File.open ou utilisez File.new. – JRL