У меня есть вычисление, которое можно разделить на независимые единицы, и способ, которым я сейчас занимаюсь, - путем создания фиксированного количества потоков и последующей передачи фрагментов работы, которые необходимо выполнить в каждом потоке. Вот как это выглядит в псевдокоде
# 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?
в основном потоке