При написании многопоточного приложения рекомендуется включить параллельные загрузки, чтобы избежать тупиковой ситуации при автозагрузке.
ActiveSupport::Dependencies.interlock.permit_concurrent_loads
ссылка на руководство
Пример в руководстведля Rails 5, как я могу добиться этого в Rails 4.2? Я не могу найти файл interlock.rb
в каталоге active_support/dependencies
.
Ожидаемое поведение
futures = @current_user.posts.map do |p|
Concurrent::Promises.future(p) do |post|
ActiveRecord::Base.connection_pool.with_connection do
post.cleanup_comments # Calls an API which takes ~2minutes
post.destroy
end
end
end
responses = futures.map(&:value)
Этот код должен быть в состоянии уничтожить все сообщения текущего пользователя одновременно.
Фактическое поведение
Когда я выполняю этот код, я получаю: Circular dependency detected while autoloading constant
ошибка. Я искал в интернете и понял, что эта проблема возникнет только в средах разработки, поэтому я смог решить эту проблему, поместив эти две строки в мой файл config/application.rb
, но я не уверен, что это правильный способ решения этого циркулярапроблема взаимоблокировки зависимостей.
config.cache_classes = true
config.eager_load = true
Может кто-нибудь подсказать мне, как написать код без взаимоблокировок в Rails4.2, который работает как в среде разработки, так и в рабочей среде?
Конфигурация системы
Версия Rails : rails -v # Rails 4.2.8
Версия Ruby : ruby -v # ruby 2.3.4p301 (2017-03-30ревизия 58214) [x86_64-darwin18]
PS: я задавал этот вопрос по проблемам Rails GitHub , но не смог найти никакого решения.