PostActionType 中线程不安全的懒加载

在使用 Discourse 的多线程 Ruby 实现和服务器(TruffleRuby/Puma)时,标志设置中的不安全哈希使用会产生错误,并且这种惰性初始化模式需要避免重复赋值:

3 个赞

在 initializer 中简单调用 PostActionType.flag_settings 能解决这个问题吗?(例如,只是暂时插入这里:discourse/config/initializers/000-mini_sql.rb at 3e0cb8ea47ea27cb3b564ac10656884739e4d78c · discourse/discourse · GitHub

我猜我们也可以同步这个块。Truffle 还有提出其他重大问题吗?

2 个赞

是的,这应该可行。
有什么理由需要惰性初始化吗?
急切初始化可以避免任何同步问题,并且访问速度稍快,也更简单。

1 个赞

坦白说,我也不确定这个惰性初始化在这里是否有意义,我们有一个插件钩子可以替换整个标志集,但这会在初始化器之前触发。

@roman 对这里进行急切初始化有什么顾虑吗?我想一个简单的修复方法是:

class << self

  def flag_settings
     ...
   end
end

flag_settings

我想到这发生的主要原因是 Ruby 没有提供一个干净的类初始化模式,所以它会迫使开发者发明自己的模式/使用惰性初始化。

2 个赞

也可以这样做,这可以避免两次读取 ivar,并使其更清晰地表明它是急切初始化的(当然,逻辑也可以放在 initial_flag_settings 辅助方法中以进行组织):

  class << self
    attr_reader :flag_settings
  end

  @flag_settings = FlagSettings.new
  @flag_settings.add(
    3,
    :off_topic,
    notify_type: true,
    auto_action_type: true,
  )
  # ...
2 个赞

是的,我认为在这里进行急切初始化是安全的。它也不应与很少使用的插件 API 冲突。

3 个赞

这是个PR:

4 个赞

该主题已在 4 天后自动关闭。不允许回复。