Как мне управлять рубиновыми потоками, чтобы они завершали всю свою работу?

У меня есть вычисление, которое можно разделить на независимые единицы, и способ, которым я сейчас занимаюсь, - путем создания фиксированного количества потоков и последующей передачи фрагментов работы, которые необходимо выполнить в каждом потоке. Вот как это выглядит в псевдокоде

# 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

В основном, как только начальное количество потоков создано, каждый выполняет некоторую работу, а затем продолжает брать то, что нужно сделать, из рабочего стека, пока ничего не останется. Все работает нормально, когда я запускаю что-то в irb, но когда я запускаю скрипт с помощью интерпретатора, все работает не так хорошо. Я не уверен, как заставить основной поток ждать, пока вся работа не будет завершена. Есть ли хороший способ сделать это, или я застрял в выполнении sleep 10 до work_units.empty? в основном потоке

24
задан davidk01 5 June 2011 в 06:34
поделиться