2009-09-11 8 views
1

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?

Répondre

0

La racine du problème a été résolu 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!

2

Si abort_on_exception est false et que l'indicateur de débogage n'est pas activé (par défaut), une exception non gérée tue le thread en cours. Vous ne le savez même pas jusqu'à ce que vous publiez une jointure sur le thread qui l'a soulevé. Donc, vous pouvez faire une jointure ou changer le drapeau de débogage et vous devriez obtenir l'exception si quelqu'un est effectivement jeté.

+0

Parfait! Je ne savais même pas sur le drapeau de débogage. – willoller

+0

@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

+1

@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