2016-03-09 1 views
0

Je fais un tas d'appels AWS pour créer/supprimer des règles de groupes de sécurité et je veux accélérer les choses avec la parallélisation.Comment ventiler une tâche liée E/S dans Ruby?

Existe-t-il un moyen général de paralléliser une opération liée aux E/S sur une collection de taille fixe? Une méthode qui prend une collection, une taille de lot et un bloc fonctionnel serait bien.

+0

Écrivez votre question sous la forme d'une question, mise en place avec les questions appropriées vous RAN dans, comme si elle était un "vraie" question, ce qu'elle est vraiment. –

+0

révisé @theTinMan – crizCraig

+0

Cela aide. Vous pourriez montrer votre vieille tentative, puisque votre réponse indique que vous avez obtenu une accélération de ~ 100x. Pensez à un Q/R auto-répondu comme ceci: Parce que SO est un livre de référence/livre de recettes de questions de programmation avec des réponses, cela aiderait les personnes qui cherchent une solution similaire à savoir par où vous avez commencé. –

Répondre

2

La méthode suivante a très bien fonctionné pour moi, ce qui donne un ~ 100x speedup:

# A method to parallelize an operation across a collection. 
# Example: 
# 
# fan_out [1, 2, 3, 4], 2 do |batch| 
# puts batch.to_s 
# end 
# 
# out >> 
# [3, 4] 
# [1, 2] 
def fan_out(arr, num_batches, &block) 
    threads = [] 
    arr.each_slice(arr.size/num_batches).each do |batch| 
    threads << Thread.new { 
     block.call(batch) 
    } 
    end 
    threads.each(&:join) 
end 
+1

C'est une très bonne solution, mais si certains lots tournent plus vite que d'autres, les threads s'arrêteront tant qu'il y a encore du travail à faire. Un objet [Queue] (http://ruby-doc.org/core-2.3.0/Queue.html) est utile pour répartir le travail entre N threads. – tadman

+0

D'accord, une file d'attente avec un pool de threads tirant des tâches serait plus efficace. Dans mon cas, chaque opération a pris à peu près le même temps, donc cela a bien fonctionné. – crizCraig

+1

Vous pourriez vouloir reconsidérer using '" "" 'dans le code Ruby Ruby n'est pas Python http://stackoverflow.com/q/28511229/128421 –