2009-11-03 5 views
1

Je fais ce que beaucoup de gens ont probablement besoin de faire, le traitement des tâches qui ont un temps d'exécution variable. J'ai la preuve de code suivante concept:Traiter n éléments à la fois (en utilisant des threads)

threads = [] 

(1...10000).each do |n| 
    threads << Thread.new do 
    run_for = rand(10) 
    puts "Starting thread #{n}(#{run_for})" 
    time=Time.new 
    while 1 do 
     if Time.new - time >= run_for then 
      break 
     else 
      sleep 1 
     end 
    end 
    puts "Ending thread #{n}(#{run_for})" 
    end 
    finished_threads = [] 
    while threads.size >= 10 do 
    threads.each do |t| 
     finished_threads << t unless t.alive? 
    end 
    finished_threads.each do |t| 
     threads.delete(t) 
    end 
    end 
end 

Il ne démarre pas un nouveau fil jusqu'à ce que l'un des fils précédents a déposés. Est-ce que quelqu'un sait une manière meilleure, plus élégante de faire ceci?

Répondre

2

Je suggère de créer un groupe de travail. Voir http://snippets.dzone.com/posts/show/3276. Soumettez ensuite tous vos travaux de longueur variable au pool et appelez le pour rejoindre pour attendre que tous les threads soient terminés.

+0

Exactement ce que je cherchais. Merci –

0

La gemme work_queue est la manière la plus simple d'effectuer des tâches de manière asynchrone et simultanée dans votre application.

wq = WorkQueue.new 2 # Limit the maximum number of simultaneous worker threads 

(1..10_000).each do 
    wq.enqueue_b do 
    # Task 
    end 
end 

wq.join # All tasks are complete after this 
+0

Je ne suis pas sûr comment cela m'aiderait à gérer le nombre total de threads en cours d'exécution à un moment donné. –

+0

La [work_queue] (https://github.com/fmmfonseca/work_queue) vous permet de limiter le nombre maximum de threads de travail simultanés et/ou de limiter le nombre maximum de tâches en file d'attente –

Questions connexes