【问题标题】:Sharing global references among jruby threads and inside Rack application在 jruby 线程和 Rack 应用程序内部共享全局引用
【发布时间】:2010-08-10 00:02:24
【问题描述】:

我正在尝试创建一个统计计数器(类似于 Twitter 为 scala 编写的 ostrich 计数器),但很难确保我的所有线程都可以访问它。我的 Stats 类是这样定义的:

class Stats
  @@counters = {}
  .. accessors ..

  def self.incr(counter, amt = 1)
    if !@@counters[counter]  
      @@counters[counter] = java.util.concurrent.atomic.AtomicInteger.new()
    end
    @@counters[counter].getAndAdd(amt)
  end
end

我知道计数器哈希本身的线程安全存在一些问题。如果我手动创建线程,它们似乎能够全局访问 Stats.counters 但我正在尝试创建一个 rackup 应用程序(Sinatra,使用 jetty-rackup 嵌入 Jetty)来显示此信息,并在该 Sinatra 应用程序中统计为空。是否有一种与应用程序的其他部分共享此计数器的好方法,或者 sinatra 是否正在做一些清除全局变量范围的事情?

【问题讨论】:

  • 是否可以选择使用 MongoDB 之类的东西?
  • 是的,我考虑过使用外部的东西,比如 Mongo 或 Redis,但我认为将它们全部保存在 JVM 中会更容易。

标签: ruby multithreading jruby


【解决方案1】:

我们在 IRC #jruby 上讨论了这个问题,但为了后人在这里重申一下,我最好的猜测是您遇到的情况是,jetty-rackup 正在创建和汇集多个运行时以用于服务请求。这些运行时中的每一个都加载了相同的 Ruby 代码,但彼此不知道,类似于多个 Ruby 进程。您有许多选项可以在它们之间共享状态。

  • 使用 Java 类(带有单例实例或静态方法/字段)
  • 使用专门构建的 Java 内存缓存库
  • 使用 Java Servlet 会话
  • 使用外部机制(memcached、DB 等)
  • 更多

【讨论】:

  • 感谢尼克的回答并将答案放在这里。
猜你喜欢
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
  • 2016-01-18
相关资源
最近更新 更多