- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个 Rails 应用程序,其中有一个 Rake 任务,该任务使用并发 ruby gem 提供的多线程函数。
有时我会遇到 Circular dependency detected while autoloading constant
错误。
在谷歌搜索了一下后,我发现这与结合使用线程和加载 Rails 常量有关。
我偶然发现了以下 GitHub 问题:https://github.com/ruby-concurrency/concurrent-ruby/issues/585和 https://github.com/rails/rails/issues/26847
如此处所述,您需要将从新线程调用的所有代码包装在 Rails.application.reloader.wrap do
或 Rails.application.executor.wrap do
block ,这就是我所做的。然而,这会导致死锁。
然后建议使用 ActiveSupport::Dependencies.interlock.permit_concurrent_loads
在主线程上包装另一个阻塞调用。但是,我不确定我应该用它包装哪些代码。
这是我尝试过的方法,但是这仍然会导致死锁:
@beanstalk = Beaneater.new("#{ENV.fetch("HOST", "host")}:#{ENV.fetch("BEANSTALK_PORT", "11300")}")
tube_name = ENV.fetch("BEANSTALK_QUEUE_NAME", "queue")
pool = Concurrent::FixedThreadPool.new(Concurrent.processor_count * 2)
# Process jobs from tube, the body of this block gets executed on each message received
@beanstalk.jobs.register(tube_name) do |job|
ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
@logger.info "Received job: #{job.id}"
Concurrent::Future.execute(executor: pool) do
Rails.application.reloader.wrap do
# Stuff that references Rails constants etc
process_beanstalk_message(job.body)
end
end
end
end
@beanstalk.jobs.process!(reserve_timeout: 10)
任何人都可以阐明我应该如何解决这个问题吗?奇怪的是我在生产中遇到了这个问题,而关于这个主题的其他信息似乎暗示它通常只应该出现在开发中。
在生产中我使用以下设置:
config.eager_load = true
config.cache_classes = true
。
所有环境的自动加载路径都是 Rails 默认加上两个特定文件夹(“models/validators”和“jobs/concerns”)。
eager_load_paths
未在我的任何配置中修改或设置,因此必须等于 Rails 默认值。
我使用的是 Rails 5,所以 enable_dependency_loading
在生产中应该等于 false
。
最佳答案
您可能需要更改 eager_load_paths
以包含引发错误的类或模块的路径。 eager_load_paths
已记录 in the Rails Guides .
您遇到的问题是 Rails is not loading these constants应用程序启动时;当它们被其他代码调用时,它会自动加载它们。在多线程 Rails 应用程序中,两个线程在尝试加载这些常量时可能会出现竞争条件。
告诉 Rails 预先加载这些常量意味着它们将在 Rails 应用程序启动时加载一次。仅仅说 eager_load = true
是不够的;您还必须指定类或模块定义的路径。在 Rails 应用程序配置中,这是 eager_load_paths
下的一个 Array
。例如,要预先加载 ActiveJob
类:
config.eager_load_paths += ["#{config.root}/app/jobs"]
或者从 lib/
加载自定义模块:
config.eager_load_paths += ["#{config.root}/lib/custom_module"]
更改预加载设置会影响 Rails 的行为。例如,在 Rails development
环境中,您可能习惯于运行一次 rails server
,每次重新加载其中一个端点时,它都会反射(reflect)对代码的任何更改你做了。这不适用于 config.eager_load = true
,因为这些类在启动时加载一次。因此,您通常只会更改 production
的 eager_load
设置。
更新
您可以从 rails console
检查现有的 eager_load_paths
。例如,这些是新 Rails 5 应用程序的默认值。如您所见,它不会加载 app/**/*.rb
;它加载 Rails 应该知道的特定路径。
Rails.application.config.eager_load_paths
=> ["/app/assets",
"/app/channels",
"/app/controllers",
"/app/controllers/concerns",
"/app/helpers",
"/app/jobs",
"/app/mailers",
"/app/models",
"/app/models/concerns"]
关于ruby-on-rails - Rails 中的多线程 : Circular dependency detected while autoloading constant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45181922/
所以如果我在 C++ 中有这样的东西: char A_char = 'A'; char * myPtr = &A_char; const char * myPtr = &char_A; //point
我试图在我的 Perl 脚本中将魔数(Magic Number)声明为常量,如 perlsub 中所述。但是,我收到警告: $ cat foo.perl use warnings ; use stri
我想为 data Constant a b = Constant a 这是我的直接尝试: instance Foldable (Constant a) where foldr f b (Const
我在客户端和服务器端拆分了我的文件夹,但我没有从父文件夹工作,我表现得好像它们是 2 个不同的文件夹...现在我想部署到 Heroku 但我为此需要一个主文件夹,所以我想更改我的 webpack.co
当函数不修改对象参数时,我总是让它请求一个常量引用,即使引用的对象不是真正的常量。这是错误的吗? 对于包装类,我想这样写: template class Wrapper{ private: B*
核心常量表达式的定义取决于常量表达式的概念,如要点 (2.7.1) 和 (2.9.1) 所示N4140 的。 §5.19/2: A conditional-expression e is a core
我有以下代码片段,它按预期工作。其中 x 是一个变量 var myVariable = (x === 'A' || x=== 'B') ? 'sui' : 'pai'; 但是闭包编译器正在将它转换为
我是一个国际化应用程序。其中一部分在于菜单的国际化。没关系。 通过 GWT,我可以使用 Constants 接口(interface)。 现在我必须国际化该应用程序的帮助,其中包括一些涉及菜单的文本。
在 Bjarne Stroustrup 的 A Tour of C++ 中,每章末尾都列出了一些建议。在第一章的结尾,其中一个写道: Avoid ‘‘magic constants;’’ use sy
创建常量数组的常量数组的语法是什么? 我希望函数参数是常量 char* 字符串的常量数组。 最佳答案 您可以通过将 const 放在第一个星号的右侧来实现,例如 void f(const char *
我有一本带图书馆的 Chef Recipe ,例如库.rb。它包含一个 CONSTANT: CONSTANT = 'constant' 当我为这本 Recipe 编写单元测试时,它总是给我警告: (S
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to check for equals? (0 == i) or (i == 0) Why does
我有以下代码: constexpr unsigned long long power_function(const unsigned long long prime, const unsigned l
在一个页面上,我有几个 Angular 模块。我为每个模块定义了一个包含模块版本的常量。 var module1 = angular.module('module1').constant('versi
C++14 中的§5.19/3 定义了一个整型常量表达式和一个转换后的常量表达式: An integral constant expression is an expression of integr
如果您打开 R# 选项并转到代码编辑> C# > 命名样式,则有 2 个设置与我非常相似。本地常量和常量字段(私有(private))。一种是 lowerCaseCamel,另一种是 UpperCam
如何将恰好命名为 reverse 的以下方法重写为允许任何枚举类型的泛型方法。 public class TestX { enum Gender { male, female } pu
我和我的一位队友进行了一次有趣的谈话。 CONSTANT.equals(VARIABLE) 是否比 Java 中的 VARIABLE.equals(CONSTANT) 快? 我怀疑这是一个虚假陈述。但
我想在 c 程序中执行脚本 cmd,所以函数 SYSTEM(CONST CHAR) 可以执行它,但我想使用这个函数和 3 个不同的参数写入一次。谁能帮帮我,有没有那种功能。 最佳答案 如果我猜对了,您
VStudio 或 ReSharper 给我以下建议: constant 在这种情况下意味着什么?如果它是当前方法作用域中的一个常量,目的是什么?方法往往很小,因此与常规 var 相比,它不应该有任何
我是一名优秀的程序员,十分优秀!