Я использую Rails 3 и Ruby 1.9.
Я использую 2 метода в различных тестах rails (и в консоли).Методы называются index_cases
и index_new_cases
, а тела методов показаны ниже.Содержимое метода index_new_cases
, вероятно, не имеет значения (я индексирую информацию ModelCase, используя гем Sunspot), но я оставляю ее там для полноты.
У меня есть 3 case_numbers
.Каждый case_number
соответствует ModelCase
в базе данных (т. Е. В БД 3 ModelCase
записей).
Когда я использую эти 3 case_numbers
для запуска тестов по методу index_cases
,метод index_new_cases
НЕ извлекает никаких случаев, используя метод ModelCase.where…
.Однако, если я уберу вызовы «threading» в методе index_cases
, функция index_new_cases
теперь извлекает все 3 случая и правильно их индексирует.
Может кто-нибудь объяснить мне, почему мои потоки не могут найтизаписи базы данных?Моя реализация потоков не так?Спасибо!
def index_cases(case_numbers)
threads = []
case_numbers.each_slice(500) do |slice_of_case_numbers|
threads << Thread.new(slice_of_case_numbers) do |a_slice|
index_new_cases(a_slice)
end
end
threads.each {|thr| thr.join}
end
def index_new_cases(case_numbers)
cs = ModelCase.where(case_number: case_numbers).includes(:child_tables)
puts cs.size # prints 0 with threading and 3 without threading
Sunspot.index(cs)
Sunspot.commit
end
Этот метод (без многопоточности) работает правильно, чтобы найти и проиндексировать записи в моей базе данных
def index_cases(case_numbers)
#threads = []
case_numbers.each_slice(500) do |slice_of_case_numbers|
#threads << Thread.new(slice_of_case_numbers) do |a_slice|
index_new_cases(slice_of_case_numbers)
#end
end
#threads.each {|thr| thr.join}
end