2010-02-11 2 views
2

Является ли следующее неэффективным? Я хочу выделить почти все ресурсы для потоков, но мне интересно, будет ли в этом случае использовать этот цикл для большого количества процессорного времени.Как эффективно контролировать Ruby Threads?

Спасибо!

threads = create_threads #method that returns an Array of Threads 
loop do 
    alive = false 
    threads.each do |thread| 
    if thread.alive? 
     alive = true 
    end 
    end 
    break unless alive 
end 

ответ

2
threads.each do |thread| 
    thread.join 
end 
+0

Но это поражает многопоточность, поскольку параллелизм эффективно отключен. Я все еще хочу, чтобы Ruby переключался между основным потоком, нитью 1, нитью 2 и т. Д. – Alexandre

+0

Он по-прежнему переключается между потоками, и он ждет, пока они все не закончатся, прежде чем продолжить. Если thread1 работает долго, а thread2 - нет, и мы ожидаем соединения в thread1, thread2 будет продолжать выполнять и заканчивать. Когда thread1 будет закончен, мы назовем join на thread2, который немедленно вернется. – Farrel

+0

Hi Farrel, Вы правы, остальные потоки продолжают выполняться. Этот пример прояснил это для меня. http://pastebin.org/90678 – Alexandre

3
threads.each &:join 

my_thread.join возвращается, как только my_thread выходов.