在编写多线程应用程序时,建议启用并发加载以避免自动加载期间的死锁。
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 -v#Rails 4.2.8
Ruby版本:ruby -v#ruby 2.3.4p301(2017-03-30修订版58214)[x86_64-darwin18]
PS:我在Rails GitHub issues上问了这个问题,但没有任何解决方法。