Comment puis-je gérer ruby fils de sorte qu'ils finissent leur travail?

J'ai un calcul qui peut être divisé en unités indépendantes et la façon dont je m'occupe maintenant, c'est par la création d'un nombre fixe de threads et ensuite de passer au large de morceaux de travail à faire dans chaque thread. Donc, en pseudo-code, voici à quoi il ressemble

# main thread
work_units.take(10).each {|work_unit| spawn_thread_for work_unit}

def spawn_thread_for(work)
  Thread.new do
    do_some work
    more_work = work_units.pop
    spawn_thread_for more_work unless more_work.nil?
  end
end

Fondamentalement, une fois le nombre de threads est créé chacun fait un peu de travail et de garde, puis de prendre des trucs à faire à partir de la pile de travail jusqu'à ce qu'il ne reste rien. Tout fonctionne bien quand je lance des choses dans la cisr, mais quand j'execute le script à l'aide de l'interprète les choses ne fonctionnent pas si bien. Je ne suis pas sûr de savoir comment faire le thread principal attendez jusqu'à ce que le travail est terminé. Est-il une bonne façon de le faire ou suis-je coincé avec l'exécution de sleep 10 until work_units.empty? dans le thread principal

  • Ne pas take(10) dire que seuls les 10 premiers work_units seront traitées, jamais?
  • Grimm: en Fait non, mais en relisant la question, il ressemble à work_units serait hors de portée pour spawn_thread_for pour la ligne more_work = work_units.pop
  • Dans le code actuel, c'est une variable d'instance, donc il n'y a pas de délimitation de l'étendue des problèmes.
InformationsquelleAutor davidk01 | 2011-06-05